Reputation: 11810
In my User model I could have:
has_many :tasks
and in my Task model:
belongs_to :user
Then, supposing the foreign key 'user_id' was stored in the tasks table, I could use:
@user.tasks
My question is, how do I declare the has_many relationship such that I can refer to a User's Tasks as:
@user.jobs
... or ...
@user.foobars
Thanks a heap.
Upvotes: 225
Views: 129039
Reputation: 131112
Give this a shot:
has_many :jobs, foreign_key: 'user_id', class_name: 'Task'
Note, that :as
is used for polymorphic associations.
Also, foreign_key option for has_many.
Upvotes: 418
Reputation: 715
If you use has_many through, and want to alias:
has_many :alias_name, through: :model_name, source: :initial_name
(thanks for the correction Sami Birnbaum)
Upvotes: 20
Reputation: 913
To complete @SamSaffron's answer :
You can use class_name
with either foreign_key
or inverse_of
. I personally prefer the more abstract declarative, but it's really just a matter of taste :
class BlogPost
has_many :images, class_name: "BlogPostImage", inverse_of: :blog_post
end
and you need to make sure you have the belongs_to
attribute on the child model:
class BlogPostImage
belongs_to :blog_post
end
Upvotes: 4
Reputation: 1337
You could also use alias_attribute
if you still want to be able to refer to them as tasks as well:
class User < ActiveRecord::Base
alias_attribute :jobs, :tasks
has_many :tasks
end
Upvotes: 79