このようなスキーマがあります。
managers
has_many :emails
has_many :stores
emails
belongs_to :manager
stores
belongs_to :manager
belongs_to :region
regions
has_many :stores
has_many :readings
readings
belongs_to :regions
マネージャーの測定値を取得したい。 SQLでは、このようなことをします。
SELECT * FROM managers
JOIN stores ON stores.manager_id = managers.id
JOIN regions ON stores.region_id = regions.id
JOIN readings ON readings.region_number = regions.number
WHERE
manager.name = 'John Smith'
AND
regions.number = '1234567'
LIMIT 100
Activerecordでこれを行う方法がわかりません。私は http://guides.rubyonrails.org/active_record_querying.html と http://guides.rubyonrails.org/association_basics.html の意味を理解しようとしていますが、沈んでいるわけではありません。別の視点から見るだけでいいと思います。
私はこのようなデータにアクセスすると思っていましたが、それがどのように機能するか理解していないと思います。
managers.name
managers.stores.name
managers.stores.regions.readings.limit(10)
私はこのようなことをしなければなりませんでした。
managers.first.stores.first.regions.first.readings.limit(10)
ser1757006 Oct 4 '13 at 14:39からのコメントにコメントしたかったのですが、十分なポイントがありません。とにかく、これはより深いネストのシナリオに対処します。惑星と国のモデルを追加して、追加のモデルを連鎖する必要があるときに構文がどのように機能するかを示しました。
@readings = Reading.includes(planet: [ country: [ region: [ {stores:
:manager}]]]).where(
manager: { name: 'John Smith' },
region: {id: 1234567 })
次のようなものを試してください:
managers.joins(stores: {regions: :readings}).where('managers.name = ? AND regions.number = ?', 'John Smith', '1234567').limit(100)
managers
がモデル名であると仮定します
managers.find(:all,
:joins=>" JOIN stores ON stores.manager_id = managers.id
JOIN regions ON stores.region_id = regions.id
JOIN readings ON readings.region_number = regions.number"
:conditions=>"manager.name = 'John Smith' AND regions.number = '1234567'"
:limit=>100)