Verwendung Modellfuge Attribute in Schienen has_many: durch
-
18-09-2019 - |
Frage
Als Beispiel habe ich ein Modell Gruppe und Modell Benutzer
Sie sind verbunden mit: has_many,: durch => groups_users
groups_users Tabelle hat ein Attribut namens Moderator, der angibt, ob ein Benutzer ein Moderator der Gruppe ist
Frage: Wie kann ich alle Moderatoren von einer bestimmten Gruppe
Nach der Lektüre über: with_scope, was in den Sinn kommt, ist
def find_moderators
Group.with_scope(:find=>{:conditions => "moderator=1"})
@moderators=@group.users
end
end
Doch nach Schienen 2, with_scope geschützt wird, und erlaubt keinen Code in der Steuerung gegeben, so Was ist die gute Alternative dazu?
Lösung
gelöst mit
class Group
has_many :groups_users
has_many :moderatorships, :class_name => "GroupsUser",:conditions => {:moderator => true}
has_many :moderators, :through => :moderatorships, :class_name => "User", :source => :user
end
Matt van Horn Antwort bevorzugt, da diese eine einzige Abfrage erzeugt, wenn wir die Benutzerinformationen mit @ group.moderators wählen, während seine Lösung für jeden Moderator
separate Abfrage gibtedit: aktualisiert Sizzlepants' Frage zu beantworten. Moderatoren mit diesem Code erstellt sollte Moderator Attribut hat, mitmachen Modell auf true gesetzt (Schienen verwendet: Bedingungen während Modell verbinden), auch jetzt, wenn ich muß es würde kodieren, i groups_users Mitgliedschaften zur besseren Lesbarkeit nennen würde
Andere Tipps
class User
has_many :group_users
has_many :groups, :through => :groups_users
end
class GroupUser
belongs_to :user
belongs_to :group
named_scope :as_moderator, :conditions => "moderator=1"
end
class Group
has_many :group_users
has_many :groups, :through => :groups_users
def moderators
group_users.as_moderator.map{|gu|gu.user}
end
end
# use it:
@moderators = @group.moderators
or
@all_mods = Group.all.map{|g|g.moderators}.flatten
Monkeypatch!
class Group < ActiveRecord::Base
public :with_scope
end