<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SNS開発者の本気帳 &#187; SubQuery</title>
	<atom:link href="http://www.synapz.jp/ogsy/tag/subquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.synapz.jp/ogsy</link>
	<description></description>
	<lastBuildDate>Thu, 04 Mar 2010 14:59:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[Rails 2.3.2] モデルのカラムにサブクエリの値が使いたいのですよ</title>
		<link>http://www.synapz.jp/ogsy/2009/10/rails-2009100201/</link>
		<comments>http://www.synapz.jp/ogsy/2009/10/rails-2009100201/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 07:08:11 +0000</pubDate>
		<dc:creator>ogsy</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SubQuery]]></category>

		<guid isPermaLink="false">http://192.168.1.2/wpmu/ogsy/2009/10/02/rails-2-3-2-%e3%83%a2%e3%83%87%e3%83%ab%e3%81%ae%e3%82%ab%e3%83%a9%e3%83%a0%e3%81%ab%e3%82%b5%e3%83%96%e3%82%af%e3%82%a8%e3%83%aa%e3%81%ae%e5%80%a4%e3%81%8c%e4%bd%bf%e3%81%84%e3%81%9f%e3%81%84/</guid>
		<description><![CDATA[
こんにちは、最近めっきり（なにが？）なおがしょ〜です。
ここ数ヶ月はずっとRubyOnRailsを勉強してますが、ようやく数％くらいわかってきた気がします。


さて、本題。ウェブアプリケーションで親子関係のあるデータを一覧表示しようとする場合で、子供側のデータを COUNT(*) してみたりしたくなる時があると思います（あるよね？ね？？）。深く考えず、はじめにRailsでやってみたのはこんな感じでした↓


# モデル：item.rb
class Item &#60; ActiveRecord::Base
&#160; # col: id
&#160; # col: name
&#160; has_many :sub_item
end
# モデル：sub_item.rb
class SubItem &#60; ActiveRecord::Base
&#160; # col: id
&#160; # col: item_id
&#160; # col: name
&#160; belongs_to :item
end
# アクション：items_controller.rb
def index
&#160;&#160; @items = Item.find :all
end
# ビュー：items/index.html.erb
&#60;% @items.each do &#124;item&#124; %&#62;
&#60;%=h item.sub_items.count %&#62;&#60;!—&#160; 小モデルの合計を表示する —&#62;
&#60;% end %&#62;



上記コードで問題なく実行できましたが、発行されるSQL文は
&#160; 親モデルのSELECT文＋（小モデルのSELECT文×行数）
となり、非常に無駄な気がします。
サブクエリを使えばSQL文は1つで済みますよね。


プラグインとか他のやり方とか探したんですが、findbysql()をする以外の方法が見つからなかったので、簡単にサブクエリを使ったカラムがモデルに追加できるプラグインを作ってみました。http://github.com/ogasyo/subquerycolumn


以下のコマンドでさくっとインストールして、&#160; $ script/plungin install git://github.com/ogasyo/subquerycolumn.git親モデルとコントローラーのfind()部分を以下の用に修正するだけ。


# モデル：item.rb
class Item &#60; [...]]]></description>
			<content:encoded><![CDATA[<p>
こんにちは、最近めっきり（なにが？）なおがしょ〜です。<br />
ここ数ヶ月はずっとRubyOnRailsを勉強してますが、ようやく数％くらいわかってきた気がします。<br />
<br />
<br />
さて、本題。ウェブアプリケーションで親子関係のあるデータを一覧表示しようとする場合で、子供側のデータを COUNT(*) してみたりしたくなる時があると思います（あるよね？ね？？）。深く考えず、はじめにRailsでやってみたのはこんな感じでした↓<br />
<br />
<br />
<pre><code># モデル：item.rb
class Item &lt; ActiveRecord::Base
&nbsp; # col: id
&nbsp; # col: name
&nbsp; has_many :sub_item
end
# モデル：sub_item.rb
class SubItem &lt; ActiveRecord::Base
&nbsp; # col: id
&nbsp; # col: item_id
&nbsp; # col: name
&nbsp; belongs_to :item
end
# アクション：items_controller.rb
def index
&nbsp;&nbsp; @items = Item.find :all
end
# ビュー：items/index.html.erb
&lt;% @items.each do |item| %&gt;
&lt;%=h item.sub_items.count %&gt;&lt;!—&nbsp; 小モデルの合計を表示する —&gt;
&lt;% end %&gt;
</code></pre>
<br />
<br />
上記コードで問題なく実行できましたが、発行されるSQL文は<br />
&nbsp; 親モデルのSELECT文＋（小モデルのSELECT文×行数）<br />
となり、非常に無駄な気がします。<br />
サブクエリを使えばSQL文は1つで済みますよね。<br />
<br />
<br />
プラグインとか他のやり方とか探したんですが、find<em>by</em>sql()をする以外の方法が見つからなかったので、簡単にサブクエリを使ったカラムがモデルに追加できるプラグインを作ってみました。<a href="http://github.com/ogasyo/sub_query_column">http://github.com/ogasyo/sub<em>query</em>column</a><br />
<br />
<br />
以下のコマンドでさくっとインストールして、&nbsp; $ script/plungin install git://github.com/ogasyo/sub<em>query</em>column.git親モデルとコントローラーのfind()部分を以下の用に修正するだけ。<br />
<br />
<br />
<pre><code># モデル：item.rb
class Item &lt; ActiveRecord::Base
&nbsp; # col: id
&nbsp; # col: name
&nbsp; hasmany :sub_item
&nbsp; sub_query_column :count_sub_items, :type =&gt; :integer, :query =&gt; “SELECT COUNT(id) FROM sub_items where sub_items.item_id = items.id”
end
# アクション：items_controller.rb
def index
&nbsp;&nbsp; @items = Item.with_sub_query.find :all
end
</code></pre>
<br />
<br />
ビュー側での値の取得はこんな感じです↓<br />
&lt;%=h item.count_sub_items %&gt;&lt;!—&nbsp; NEW! 小モデルの合計を表示する —&gt;<br />
<br />
以上で超簡単にできます。<br />
<br />
<br />
サクッと簡単に作ったプラグインなのでテストはありませんし、バグもあると思います。<br />
利用する場合はきっちりデバッグを行うようにオヌヌメします。<br />
できればGitHubでForkして改良してくれれば最高です（他力本願<br />
＃あと、他の方法でこんなのあるよ、とかもうすでに同じのあるだろ、とかはこっそり教えてくれるとありがたいです。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.synapz.jp/ogsy/2009/10/rails-2009100201/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

