2009-07-22 5 views
155

Dans mon modèle d'utilisateur je pouvais avoir:Rails has_many avec le nom d'alias

has_many :tasks 

et dans mon modèle de tâche:

belongs_to :user 

Ensuite, en supposant que la clé étrangère « user_id » a été stockée dans les tâches table, je pouvais utiliser:

@user.tasks 

Ma question est, comment puis-je déclare la relation has_many telle que je peux faire référence aux tâches d'un utilisateur comme:

@user.jobs 

... ou ...

@user.foobars 

Merci un tas.

+7

Je serais fatigué d'utiliser la tâche comme un nom de classe - c'est un mot réservé Rails et pourrait causer des problèmes étranges sur la route: http://reservedwords.herokuapp.com/ –

+0

J'ai eu le même problème @doctororange! –

Répondre

303

Donnez ce un coup:

has_many :jobs, foreign_key: "user_id", class_name: "Task" 

Notez que :as est utilisé pour polymorphic associations.

+0

Merci d'avoir également inclus la clé étrangère - résolu mon problème similaire mais différent. –

+2

Est-ce que cela nécessite quelque chose de spécial du côté de la tâche ou est-ce que l'habituel 'belongs_to' est suffisant? –

-49

Vous pouvez le faire de deux manières différentes. L'un est à l'aide « comme »

has_many :tasks, :as => :jobs 

ou

def jobs 
    self.tasks 
end 

Il est évident que la première serait la meilleure façon de le gérer.

+0

Merci, cela semble parfait. Malheureusement, cela ne fonctionne pas: : UTILISATEUR MODÈLE has_many: tâches,: as =>: created_tasks CONTRÔLEUR: @created_tasks = @ user.created_tasks ----- NoMethodError dans TasksController # Index La méthode undefined 'created_tasks 'pour # doctororange

+35

: comme cela est utilisé pour les associations polymorphes pas pour ce problème particulier ... –

+3

La seconde méthode est en fait très utile pour créer un alias de l'association. – jpgeek

25

Vous pouvez également utiliser alias_attribute si vous voulez toujours être en mesure de se référer à eux comme des tâches ainsi:

class User < ActiveRecord::Base 
    alias_attribute :jobs, :tasks 

    has_many :tasks 
end 
Questions connexes