2012-11-01 178 views
0

我現在有用於車輛的模型,該模型具有規定的所有者屬性自定義方法:Rails has_many:通過自定義屬性?

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

那麼,我可以做一個:通過關聯當所有者在自定義方法中定義,而不是一個正常的變量?

回答

1

要直接回答你的問題,不需要。

Rails的has_many :through功能旨在處理ActiveRecord關聯。在這裏,您通過vehicles表聲明瞭一個名爲owners的表的關聯,但實際上沒有要加入的所有者表:由於您使用某個屬性手動查找所有者,因此不會將它們作爲記錄保存在數據庫。

爲了讓你的工作,我只是跳過使用ActiveRecord協會。相反,只是定義是這樣的模式有問題:

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

可以使用通過協會,如果你在你的數據庫啓動節能業主,不過,在這種情況下,您所提供的語法將起作用。

0

Rails Api表示through:選項希望您指定通過其執行查詢的關聯。它試圖找到基於連接表車輛的該業主協會,但找不到它,因爲它不在那裏。我不認爲你的apporach可以工作,而不需要深入Rails的HasMany-Builder。