「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ってもっと簡単に書けるようにならないのかな。。