Simolification de code

Bonjour je voudrais savoir si je peux simplifier mon code.
J’ai les modèles suivants :
user (has_many :roles)
room (has_many :roles)
role has_many :users, :rooms
La table role contenant, en plus des clés étrangères, le code role
(admin, simple utilisateur, …)

Pour rechercher tous les administrateurs d’une salle, j’ai écrit une
methode dans le modèle utilisateur qui va chercher dans la table role
les enregistrements pour lesquels le code_role est admin pour la salle
spécifiée en paramètre.
et ensuite je boucle sur ces roles pour aller récupérer les users
correspondant.
Cela donne le code suivant mais je me demande s’il n’y a pas plus
simple comme code

def self.find_admins_of(room)
roles = Role.find_admins_by(room.id)
admins = []
for role in @roles
admins << find(role.user_id)
end
admins
end

Peut-être faire :

class Room < AR::B

has_many :roles
has_many :admins, :through => :roles, :conditions => [“code_role = ?”,
“admin”]

end

Après tu devrais pouvoir faire directement
Room.find(room_id).admins


Michel B.

Merci pour ta réponse Michel.
C’est une bonne idée car ça me remplace la méthode
Role.find_admins_by(room.id) que j’ai écrite, par contre est ce que je
peux simplifier la boucle qui me permet ensuite de récupérer les
utilisateurs à partir des roles.

Nicolas

On Aug 26, 2:38 pm, “Michel B.” [email protected]

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 B.

Super!

Merci pour cette réponse détaillée.

Nicolas