web-dev-qa-db-fra.com

Rails has_many avec nom d'alias

Dans mon modèle d'utilisateur, je pourrais avoir:

has_many :tasks

et dans mon modèle de tâche:

belongs_to :user

Ensuite, en supposant que la clé étrangère 'user_id' soit stockée dans la table des tâches, je pourrais utiliser:

@user.tasks

Ma question est la suivante: comment déclarer la relation has_many telle que je puisse faire référence aux tâches d'un utilisateur comme suit:

@user.jobs

... ou ...

@user.foobars

Merci beaucoup.

176
doctororange

Donnez un coup de feu:

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

Notez que :as est utilisé pour associations polymorphes .

339
Sam Saffron

Vous pouvez aussi utiliser alias_attribute si vous souhaitez toujours pouvoir vous y référer également en tant que tâches:

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

  has_many :tasks
end
44
Pwnrar

Pour compléter la réponse de SamSaffron:

Vous pouvez utiliser class_name soit foreign_key ou inverse_of. Personnellement, je préfère le déclaratif plus abstrait, mais ce n’est qu’une question de goût:

class BlogPost
  has_many :images, class_name: "BlogPostImage", inverse_of: :blog_post  
end

et vous devez vous assurer que vous avez le belongs_to attribut sur le modèle enfant:

class BlogPostImage
  belongs_to :blog_post
end
1
Ghis