Domanda

ad esempio, ho un gruppo modello e un utente modello

sono connessi con :has_many, :through => groups_users

La tabella groups_users ha un attributo, chiamato moderator, che specifica se un utente è un moderatore del gruppo

domanda:come faccio ad accedere a tutti i moderatori di un determinato gruppo?

dopo aver letto di :with_scope, quello che mi viene in mente è

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

Tuttavia, dopo i binari 2, with_scope diventa protetto e non consente un determinato codice nel controller, quindi qual è la buona alternativa a questo?

È stato utile?

Soluzione

risolto 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

Preferisco la risposta di Matt van Horn perché questa produce solo una query quando selezioniamo le informazioni dell'utente con @group.moderators, mentre la sua soluzione fornisce query separate per ciascun moderatore

modificare:aggiornato per rispondere alla domanda di Sizzlepants.i moderatori creati con questo codice dovrebbero avere l'attributo moderator nel modello di join impostato su true (rails utilizza :conditions durante la creazione del modello di join), inoltre, se dovessi codificarlo ora, nominerei le iscrizioni groups_users per leggibilità.

Altri suggerimenti

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

Scimmia!

class Group < ActiveRecord::Base
   public :with_scope
end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top