web-dev-qa-db-ja.com

複数の結合によるActiveRecordクエリ

このようなスキーマがあります。

database schema

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.htmlhttp://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)
23
user1757006

ser1757006 Oct 4 '13 at 14:39からのコメントにコメントしたかったのですが、十分なポイントがありません。とにかく、これはより深いネストのシナリオに対処します。惑星と国のモデルを追加して、追加のモデルを連鎖する必要があるときに構文がどのように機能するかを示しました。

@readings = Reading.includes(planet: [ country: [ region: [ {stores:
:manager}]]]).where(
manager: { name: 'John Smith' },   
region: {id: 1234567 })
8
Aaron Taddiken

次のようなものを試してください:

managers.joins(stores: {regions: :readings}).where('managers.name = ? AND regions.number = ?', 'John Smith', '1234567').limit(100) 
5

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)
5
shiva