與您的示例一樣,每個模型類僅代表數據庫記錄的這些實例之一,即Meter
類僅表示meters
表中的meter
行。因此,考慮到這一點,您可以看到,聲明表示這些meter
實例中的每一個都有很多contracts
。
我們把這個線下來:@customer.meters.contracts
你有你的@customer
實例,你要求它爲所有的米:@customer.meters
。 meters
方法的返回是屬於該@customer
的meters
的集合。由於這是一個meter
的實例,它有很多合同,所以你不能以這種方式要求收集米的合同。
你可以問它的個人計的,但:@customer.meters.first.contracts
或者你可以遍歷所有的米,並得到所有的合同:
@customer.meters.flat_map(&:contracts) # => an array of all the contracts
,或者更一般地說,你可能想顯示的列表客戶的合同中一個觀點:
<% @customer.meters.each do |meter| %>
<% meter.contracts.each do |contract|
// display the contract
<% end %>
<% end %>
但是,可以關聯所有contracts
到customer
通過meters
協會:
class Customer < ApplicationRecord
has_many :meters, -> { includes :contracts }
# ActiveRecord's shorthand declaration for associating
# records through a join table, in this case 'meters'
has_many :contracts, through: :meters
end
通過添加has_many X, through: Y
,您表示客戶記錄通過連接表Y
與另一個表X
中的記錄相關聯。
有了這個,給定一個customer
與現有meters
並具有現有contracts
,你就可以調用這些@customer.contracts
米,ActiveRecord的將客戶的meters
他們contracts
加盟取contracts
並返回contracts
集合。
更多關於Rails有很多通過關聯:http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association