Comment gérer les utilisateurs et leurs rôles avec une liaison has_one
Je me suis arraché les cheveux pour trouver la bonne manière de gérer un cas d’utilisation relativement courant dans une application web : ayant un modèle (et une table) User, je souhaitais pouvoir affecter un utilisateur à chaque modèle Account (stocké dans une table … accounts) en tant que Manager. Bien entendu, je souhaitais pour voir accéder à mon manager en faisant :
a = Account.first a.manager = User.first
En fait c’est très simple, en utilisant les options disponibles dans les associations. On aura donc dans le modèle Account une association belongs_to
:
class Account < ActiveRecord::Base belongs_to :manager, :class_name => 'User' end
Au lieu de faire simplement un belongs_to :user
, on indique à Rails le modèle qui doit être utilisé.
Dans le modèle User, on aura l’association inverse :
class User < ActiveRecord::Base has_one :account, :foreign_key => 'manager_id' end
Afin que Rails puisse retrouver l’utilisateur à partir de la table accounts, il faut bien sûr désigner la colonne qui va héberger l’identifiant de l’utilisateur grâce au paramètre :foreign_key
.
Vous aurez bien entendu ajouté cette colonne à la table accounts en créant une migration :
rails g migration AddManagerIdToAccount
Qui contiendra le code suivant :
class AddManagerIdToAccounts < ActiveRecord::Migration def change add_column :accounts, :manager_id, :integer end end
Vous pouvez ensuite exécuter la migration, et  le tour est joué !
Répondre
Se joindre à la discussion ?Vous êtes libre de contribuer !