Rails has_many:通过自定义属性?

时间:2012-11-01 15:59:29

标签: ruby-on-rails ruby-on-rails-3 activerecord

我目前有一个车辆模型,它有一个定义所有者属性的自定义方法:

def owners
    @owners = sales.map(&:customer) + quotes.map(&:customer)
    @owners = @owners.uniq
end

此方法似乎工作正常,并返回车辆所有者的数组。

但是,当我想使用此方法在另一个模型中生成的owners时,我遇到了问题。当我在另一个模型上执行此操作时:

has_many :owners, :through => :vehicles

这会产生错误:

ActiveRecord::HasManyThroughSourceAssociationNotFoundError: Could not find the source association(s) :owner or :owners in model Vehicle.

我尝试添加:source => :owners,但我收到同样的错误。

我应该指出我在attr_accessible中有:owners

那么,我可以做一个:通过关联在所有者是在自定义方法中定义,而不是一个普通的变量?

2 个答案:

答案 0 :(得分:1)

直接回答你的问题,没有。

Rails'has_many :through功能旨在用于ActiveRecord关联。在这里,您通过owners表声明与vehicles表的关联,但实际上没有要加入的所有者表:因为您手动使用属性找到所有者,所以您不是不要将它们保存为数据库中的记录。

为了让这个适合你,我会跳过使用ActiveRecord关联。相反,只需在相关模型上定义类似的内容:

def owners
  self.vehicles.collect(&:owners).flatten.uniq
end

如果您开始在数据库中保存所有者,可以使用直通关联,但在这种情况下,您提供的语法将起作用。

答案 1 :(得分:0)

Rails Api表示,through:选项要求您指定执行查询的关联。它试图根据连接表车辆找到这个所有者关联,但找不到它,因为它不在那里。我不认为你的apporach可以在没有大量潜入Rails的HasMany-Builder的情况下工作。