たまにはrailsネタでも。findで:includeオプション
たまにはRailsネタでも
discussions | messages |
---|---|
id | id |
title | discussion_id |
text | |
user_id |
上みたいにdiscussionsテーブルとmessagesテーブルがあるとします。
discussionsテーブルは掲示板のスレッド、messagesテーブルはそのスレッドに属する発言をおさめてあるテーブルです。
このとき、あるユーザ(user_idが1とする)が発言をしたスレッドのタイトルをリストとして欲しいとします。
普通にsqlで取り出そうとしたら
select title from discussions inner join messages on discussions.id = messages.discussion_id where messages.user_id=1
とかやればいいんですけど、railsでfindメソッドを使ってさらっと書くやり方がわからず、危うくこのSQL文をそのまま投げ込む所でした。
別にこのくらいのSQLならそんなに複雑でもないですし、そのまま投げてもいい気もするんですが、David曰く「でも、SQLって汚くない?」と仰せになっておられるので、railsの流儀でやりたいですよね。それで見つけたのが:includeオプションでした。
この:includeオプションをつけてfindをつかうとこんなかんじになります。
Discussion.find(:all, :conditions => "messages.user_id=1", :include => :messages)
でも、注意すべき事が一つあります。それは二つのテーブル間のリレーションシップをhas_many宣言しとかないといけないとこです。
:includeオプションは、どうやらこのリレーションシップの宣言をたよりにして、クエリを生成してるみたいです。