おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

ActiveRecord::QueryMethods#joins のメモ

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 が返ることになる。