-
2009/10/02 16:08
[Rails 2.3.2] モデルのカラムにサブクエリの値が使いたいのですよ
こんにちは、最近めっきり(なにが?)なおがしょ〜です。
ここ数ヶ月はずっとRubyOnRailsを勉強してますが、ようやく数%くらいわかってきた気がします。さて、本題。ウェブアプリケーションで親子関係のあるデータを一覧表示しようとする場合で、子供側のデータを COUNT(*) してみたりしたくなる時があると思います(あるよね?ね??)。深く考えず、はじめにRailsでやってみたのはこんな感じでした↓
# モデル:item.rb
class Item < ActiveRecord::Base
# col: id
# col: name
has_many :sub_item
end
# モデル:sub_item.rb
class SubItem < ActiveRecord::Base
# col: id
# col: item_id
# col: name
belongs_to :item
end
# アクション:items_controller.rb
def index
@items = Item.find :all
end
# ビュー:items/index.html.erb
<% @items.each do |item| %>
<%=h item.sub_items.count %><!— 小モデルの合計を表示する —>
<% end %>上記コードで問題なく実行できましたが、発行されるSQL文は
親モデルのSELECT文+(小モデルのSELECT文×行数)
となり、非常に無駄な気がします。
サブクエリを使えばSQL文は1つで済みますよね。プラグインとか他のやり方とか探したんですが、findbysql()をする以外の方法が見つからなかったので、簡単にサブクエリを使ったカラムがモデルに追加できるプラグインを作ってみました。http://github.com/ogasyo/subquerycolumn
以下のコマンドでさくっとインストールして、 $ script/plungin install git://github.com/ogasyo/subquerycolumn.git親モデルとコントローラーのfind()部分を以下の用に修正するだけ。
# モデル:item.rb
class Item < [...]