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?

War es hilfreich?

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 gibt

edit: 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top