204
votes

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.

5
I'd be weary of using Task as a class name - it is a Rails reserved word and might cause strange issues down the road: reservedwords.herokuapp.comJoshua Pinter

5 Answers

390
votes

Give this a shot:

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

Note, that :as is used for polymorphic associations.

67
votes

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
8
votes

If you use has_many through, and want to alias:

has_many :alias_name, through: model_name, source: initial_name
4
votes

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
-62
votes

You could do this two different ways. One is by using "as"

has_many :tasks, :as => :jobs

or

def jobs
     self.tasks
end

Obviously the first one would be the best way to handle it.