2012-03-05 6 views
0

私はProductsとStatement_Salesのモデルを持っており、ビュー内にセールスレポートと基本的なアナリティクスを提示するために、さまざまな合計とグループアクションを実行したいと考えています。モデルやコントローラを置くのに最適な場所はどこですか?また、私の見解ではどのようにアクセスしますか?私は簡単に私の見解では、このようなものを使用してラインの販売日付でラインに持ち込むことができます現時点で売上合計/グループ化 - これらの機能を実行する場所は?

<% @product.statement_sales.each do |sales| %> 
<td><%= sales.units %></td> 
<% end %> 

しかし、これはラインデータによるラインでは、私が最初にすることにより、合計を与えることができるようにしたいです日付は、その後、7日、1ヶ月、3ヶ月、1年などなどコンソールで

の合計私が使用して日付によってグループ分けを考え出した:

p.statement_sales.group(:date).sum(:units) 

ないトンにそれを持参する方法がわから彼はappと1つの日付でグループ化を超えてそれを取る。

Rails(PHPの年を経た後)にはかなり新しいので、差分アプローチでいくつかの壁に当たっています。私はこれが実際にはかなり簡単だと確信しています!前もって感謝します。

答えて

0

親指のルールは「太ったモデル、スキニーコントローラ」です。これは、ほとんどのロジックをモデルにプッシュし、コントローラの動作を可能な限りシンプルに保つことを意味します。

具体的なシナリオでは、Rails scopesを調べることをお勧めします。スコープを使用すると、上で説明したような複雑なクエリをカプセル化して再利用できます。

class StatementSale < ActiveRecord::Base 
    scope :units_by_date, group(:date).sum(:units) 
end 

これは、あなたのビューで@product.statement_sales.units_by_dateを呼び出すことができるようになる:たとえば、あなたはbelongs_toProductは(私はあなたのオブジェクトグラフの詳細を知らない)StatementSaleモデルを持っていると仮定。

また、パラメータをとるスコープを構築することもできます。たとえば、あなたが動的にして、グループにパラメータを渡すことができるように望んでいたと言う、あなたの範囲は、次のようになります。

scope :units_grouped_by, lambda { |p| group(p).sum(:units) }

をあなたがしたいと思い、より複雑なクエリの詳細を知らなくても実行すると、スコープは間違いなくすべてのロジックを格納する場所です。

+0

ありがとう、これを試してみましょう。 – Raoot

+0

スコープのアプローチdoens'tは動作するようです、私はエラーが発生します。しかし、うまくいくようなフォローアップを試みました:def self.units_by_date グループ(:date).sum(:units) end – Raoot

+0

あなたが見ているエラーは何ですか?スコープを使用する代わりに、クラスメソッドを追加することはできますが、両方を同じ意味で使用できるはずです。 –

関連する問題