0
首先,如果標題不是非常準確,請原諒。如何使用ActiveRecord通過另一個集合訪問集合
比方說,我有這些模型:
class User < ActiveRecord::Base
belongs_to :user_group
end
class UserGroup < ActiveRecord::Base
has_many :users
has_many :records
end
class Record < ActiveRecord::Base
belongs_to :user_group
has_many :invoices
end
class Invoice < ActiveRecord::Base
belongs_to :record
end
我想從CURRENT_USER(用戶)對他的用戶組的所有未付發票來訪問。類似這樣的:
current_user.user_group.records.invoices.where(:payment => false)
顯然上面的代碼不起作用。我發現的最接近的做法是這樣的:
class UserGroup
def unpaid_invoices
records.map{|r| r.invoices.unpaid}
end
end
class Invoice
def self.unpaid
where(:payment => false)
end
end
,然後我可以這樣做:
current_user.user_group.unpaid_invoices
然而,這是不可伸縮的,因爲當我想用一個新的條件,如與發票金額大於1000美元,我需要在這些模型中創建兩個新方法。
有一些魔術導軌的方式來做到這一點?我錯過了什麼嗎?謝謝!
你可以聲明裏面'UserGroup'像'的has_many:發票:通過=>:records' – taro 2012-01-10 20:32:35
禾,這是如此簡單而有用的。我現在覺得很高興:)。請將它作爲答案發布,我會接受它。謝謝。 – 2012-01-10 21:33:01
順便說一句,你的解決方案令我感到驚訝,因爲直到現在,我一直只使用'has_many:through'來實現多對多的關係。 我剛看到這個方法也被記錄在了Rails指南: _The的has_many:通過關聯是通過嵌套的has_many associations._ 設置「快捷方式」,也有用http://guides.rubyonrails.org/association_basics .html#the-has_many-through-association – 2012-01-10 22:21:29