2011-02-25

ActiveScaffoldでsum

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsのScaffoldをステキにするActiveScaffoldで特定のカラムの合計値を表示したいなぁと思ったわけです。

以下のようなテーブルがあるとします。
users
id
name

orders
id
user_id
amount

このようなテーブルがあっとしてuser毎のorderのamount合計を表示したいと思ったわけです。

とりあえず二つ方法がある感じです。

(1)userコントローラからorderコントローラをネスト表示してorderコントローラのリストに合計値を表示。
以下のような感じでコントローラーを準備します。
class UsersController < ApplicationController
  active_scaffold :users do |config|
    config.nested.add_link("オーダー", [:orders])
  end
end

class OrdersController < ApplicationController
  active_scaffold :orders do |config|
    config.columns[:amount].calculate = :sum
  end
end
これでhttp://budanters.blogspot.com/2009/10/adding-multiple-column-calculations-to.htmlにあるような感じでリストの下に合計値が表示されます。
合計値意外に、calculateが対応しているものとして:avgがあるようです。

この方法で表示すると合計値がSumと表示されるので、これを日本語にするには
vendor/plugins/active_scaffold/frontends/default/views/_list_calculations.html.erb
を対象のviewにコピーしていじってやればOKです。
この場合だと
app/view/order
の下にコピーとなります。

これでもよいっちゃぁよいのですが、できるならばuserコントローラに表示したいです。
というわけで、もう一つの方法です。
(2)モデルに合計値を定義しておいて表示する
まずはuserモデルに合計値を定義します。
class User < ActiveRecord::Base
  has_many :orders

  def order_total
    self.orders.sum(:amount)
  end
end
で、以下のようにuserコントローラを準備します。
class UsersController < ApplicationController
  active_scaffold :users do |config|
    config.list.columns << :order_total
  end
end

これでuserのリストのユーザ毎の合計値が表示されます。

なかなか便利なActiveScaffoldです。
コメントを投稿