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é !

0 réponses

Répondre

Se joindre à la discussion ?
Vous êtes libre de contribuer !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *