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]
-~----------~----~----~----~------~----~------~--~---