我目前有一个车辆模型,它有一个定义所有者属性的自定义方法:
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
。
那么,我可以做一个:通过关联在所有者是在自定义方法中定义,而不是一个普通的变量?
答案 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的情况下工作。