Ruby on Rails Guides: Active Record Query Interface の joins の章を見てメモったので載せておきます。
11 Joining Tables
joins メソッドについて。
11.1 Using a String SQL Fragment
単純に JOIN 節の生 SQL を引数として書ける
Client.joins('LEFT OUTER JOIN addresses ON addresses.client_id = clients.id')
上記のメソッドの結果は下記のようになる
SELECT clients.* FROM clients LEFT OUTER JOIN addresses ON addresses.client_id = clients.id
11.2 Using Array/Hash of Named Associations
INNER JOIN のみ対応。定義している関連の名前で joins メソッドが使える。
通常パターン
Category.joins(:posts)
複数JOIN
Post.joins(:category, :comments)
- post と category
- post と comments
で join
ネスト
Post.joins(:comments => :guest)
- post と comments
- comments と guest
で join
混合
Category.joins(:posts => [{:comments => :guest}, :tags])
- category と posts
- posts と comments
- comments と guest
- posts と tags
で join
11.3 Specifying Conditions on the Joined Tables
JOIN しても普通に where でクエリの条件書ける。
time_range = (Time.now.midnight - 1.day)..Time.now.midnight
Client.joins(:orders).where('orders.created_at' => time_range)
time_range = (Time.now.midnight - 1.day)..Time.now.midnight
Client.joins(:orders).where(:orders => {:created_at => time_range})
上記のコードは BETWEEN を使って、昨日作られた Order を持つ Client を返す。この時 Client に対応する Order が複数存在する場合は、対応する Order 個数分の Client が返ることになる。