rails3 joinsで別モデルの情報も条件に加える

「Rails3 joins」
でググるとこのブログがトップに出ることが多いので、ヤバイと思ってjoinsの記事を書く。

UserとItemが1対多である次のようなモデルがあるとする。

class User
  has_many :items
end

class Item
  belongs_to :user
end

Itemにはnameという名前を保存するカラムがあり、”エクスカリバー”という名前のItemを持っているUserを抽出したい場合は以下の様に書ける

User.joins(:items).where(Item.arel_table[:name].eq('エクスカリバー')).uniq

joinsでItemsを結合して、Itemのarel_tableを使えばItemのカラムを条件に書くことができる。

この時、どんなSQLが発行されているかというとこんな。

SELECT DISTINCT `users`.* FROM `users`
  INNER JOIN `items` ON `items`.`user_id` = `users`.`id`
  WHERE `items`.`name` = 'エクスカリバー'

ちなみに、arel_tableで「=」を使う場合は「eq」
「<」は「lt」
「>」は「gt」
「<=」は「lteq」
「>=」は「lteq」

arel_tableってもっと簡単に書けるようにならないのかな。。

タイトルとURLをコピーしました