Rails has_many具有别名


186

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

has_many :tasks

在我的任务模型中:

belongs_to :user

然后,假设外键“ user_id”存储在任务表中,我可以使用:

@user.tasks

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

@user.jobs

... 要么 ...

@user.foobars

谢谢你


7
我会厌倦使用Task作为类名-这是一个Rails保留字,可能会在以后引起奇怪的问题:reservedwords.herokuapp.com
Joshua Pinter 2012年

Answers:



55

你也可以使用alias_attribute,如果你仍然希望能够把它们称为任务,以及:

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

  has_many :tasks
end

3

要完成@SamSaffron的答案:

您可以使用class_name与任一foreign_keyinverse_of。我个人更喜欢抽象的声明式,但实际上只是一个问题:

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

并且需要确保belongs_to在子模型上具有该属性:

class BlogPostImage
  belongs_to :blog_post
end

0

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

has_many :alias_name, through: model_name, source: initial_name

-61

您可以通过两种不同的方式执行此操作。一种是使用“ as”

has_many :tasks, :as => :jobs

要么

def jobs
     self.tasks
end

显然,第一个将是处理它的最佳方法。


谢谢,听起来很完美。不幸的是,这无法正常工作:用户模型:has_many:tasks,:as =>:created_tasks控制器:@created_tasks = @ user.created_tasks -----#<User:0xb6050b5c>中TasksController#index未定义方法'created_tasks'中的NoMethodError
Doctororange

4
实际上,第二种方法对于创建关联的别名非常有用。
jpgeek 2012年

正如Sam所说,这似乎不合适,因为:是用于多态关联的。
Michael K Madison
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.