0

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

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,但我得到了同样的错误。

我应该指出我确实有:ownersattr_accessible。

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

4

2 回答 2

1

直接回答你的问题,不。

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

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

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

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

于 2012-11-01T16:13:00.440 回答
0

Rails Api 说 through: 选项希望您指定一个关联来执行查询。它试图根据连接表车辆找到这个所有者关联,但找不到它,因为它不存在。我认为如果不从 Rails 深入研究 HasMany-Builder,您的方法就无法工作。

于 2012-11-01T16:14:27.230 回答