たまには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オプションは、どうやらこのリレーションシップの宣言をたよりにして、クエリを生成してるみたいです。