Pregunta

como un ejemplo, tengo un Grupo de modelos y el modelo de Usuario

están conectados con :has_many, :through => groups_users

groups_users tabla tiene un atributo, llamado moderador, especificando si un usuario es moderador del grupo

pregunta:¿cómo puedo acceder a todos los moderadores de un grupo determinado?

después de leer acerca de :with_scope, lo que viene a la mente es

def find_moderators
 Group.with_scope(:find=>{:conditions => "moderator=1"})
   @moderators=@group.users
 end
end

Sin embargo, después de rails 2, with_scope está protegida, y no permitir que dado el código en el controlador, entonces ¿Cuál es una buena alternativa para que?

¿Fue útil?

Solución

resuelto con

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

Preferencia a la respuesta de Matt van Horn porque éste produce sólo una consulta cuando seleccionamos la información del usuario con @ group.moderators, mientras que su solución ofrece a consulta independiente para cada moderador

editar: actualizado para responder a la pregunta Sizzlepants'. moderadores creados con este código debe tener moderador atribuyen en el modelo establecido se unen a los verdaderos (carriles utiliza: las condiciones de unirse al crear el modelo), también, si tendría que codificar ahora, lo nombraría groups_users membresías para facilitar la lectura

Otros consejos

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top