Déjà pour commencer une petite correction de ce que j'ai envoyé hier soir,
il en manquait un bout :
class Room < AR::B
  ...
  has_many :roles
  has_many :admins, :through => :roles, :source => :user, :conditions =>
["code_role = ?", "admin"]
  ...
end

En assumant bien entendu que le modèle Role ressemble à :

class Role < AR::B
  ...
  belongs_to :room
  belongs_to :user
  ...
end

Ensuite tu fais donc :
Room.find(room_id).admins
Et tu obtiens en réponse la liste des users admin (et non pas des rôles
admin).

Sinon, si tu tiens vraiment à passer par la liste des rôles de la salle, tu
peux faire aussi :

class Role < AR::B
  ...
  named_scope :admin, :conditions => ["code_role = ?", "admin"]
  named_scope :with_user, :include => :user
  ...
end

Ce qui permet ensuite de faire :

Role.admin.with_user.find_by_room_id(room_id).collect { |role| role.user }

Ca peut avoir l'avantage d'être plus modulable si tu commence à faire du
polymorphisme (mettons que tu attaches autre chose que des salles aux rôles)
:

class Role < AR::B
  ...
  belongs_to :rolable, :polymorphic => true
  named_scope :admin, :conditions => ["code_role = ?", "admin"]
  named_scope :with_user, :include => :user
  ...
end

class Room < AR::B
  ...
  has_many :roles, :as => :rolable
  ...
end

class Computer < AR::B
  ...
  has_many :roles, :as => :rolable
  ...
end

Tu pourrais ensuite faire des choses comme ça :
Role.admin.with_user.find_by_rolable(rolable).collect { |role| role.user }


-- 
Michel Belleville

--~--~---------~--~----~------------~-------~--~----~
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de 
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse 
[email protected]
Pour résilier votre abonnement envoyez un e-mail à l'adresse [EMAIL PROTECTED]
-~----------~----~----~----~------~----~------~--~---

Répondre à