Rails has_many带别名

时间:2009-07-22 04:14:25

标签: ruby-on-rails has-many

在我的用户模型中,我可以:

has_many :tasks

并在我的任务模型中:

belongs_to :user

然后,假设外键'user_id'存储在tasks表中,我可以使用:

@user.tasks

我的问题是,如何声明has_many关系,以便我可以将用户的任务称为:

@user.jobs

......或......

@user.foobars

感谢一堆。

5 个答案:

答案 0 :(得分:336)

试一试:

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

注意,:as用于polymorphic associations

答案 1 :(得分:41)

如果您仍希望能够将它们作为任务引用,也可以使用alias_attribute

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

  has_many :tasks
end

答案 2 :(得分:3)

如果您通过has_many使用,并且想要别名:

+----------+--------+--------+
|   name   | version| count  |
+----------+--------+--------+
| book     |      1 |      2 |
| book     |      2 |      1 |
| pen      |      1 |      1 |
| pen      |      2 |      3 |
| paper    |      1 |      1 |
| paper    |      2 |      0 |
+----------+--------+--------+

答案 3 :(得分:1)

完成@SamSaffron的回答:

您可以将class_nameforeign_keyinverse_of一起使用。我个人更喜欢抽象的声明式,但这实际上只是一个口味问题:

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

,您需要确保子模型上具有belongs_to属性:

class BlogPostImage
  belongs_to :blog_post
end

答案 4 :(得分:-57)

你可以用两种不同的方式做到这一点。一个是使用“as”

has_many :tasks, :as => :jobs

def jobs
     self.tasks
end

显然第一个是处理它的最好方法。