doctororange
doctororange

Reputation: 11810

Rails has_many with alias name

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

Answers (4)

Sam Saffron
Sam Saffron

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

A. Askarov
A. Askarov

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

Ghis
Ghis

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

Pwnrar
Pwnrar

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

Related Questions