Rails - 私の見解からの計算を移動しますか?
-
20-12-2019 - |
質問
現在、私の景色の中でいくつかの計算を行い、もちろん、
<% categories.each do |c| %>
....
<%= c.transactions.sum("amount_cents") %>
....
<% end %>
.
私は上記の問題をリファクタリングするのに役立つ方法を研究しています。
計算を私のコントローラーに移動することです
@category_sum = @transaction.sum("amount_cents")
.
はおそらくより良い解決策ですが、あなたは知っています。完璧ではありません。
多くのユーザーがいますので、電卓ロジックを自分のモデルに移動できますか。だから私は新しいクラスを使う必要があるかもしれないと思います。私は正しいトラックにいますか?コードとデザインを再構築し、このクラスを実装する方法についてのアドバイスに感謝します。
解決
ビューロジックを分離するための1つの平均は、プレゼンターを使用することです。
発表者はあなたがそのようなことをすることを可能にします:
<% categories.each do |c| %>
....
<% present c do |category| %>
<%= category.transaction_sum %>
<% end %>
....
<% end %>
.
app/presenters/category_presenter.rb
にプレゼンタークラスを持っています:
class CategoryPresenter < BasePresenter
presents :category
def transaction_sum
category.transactions.sum("amount_cents")
end
end
.
もちろん、その発表者に多くのメソッドがある場合に最適です(ただし、ビューロジックの減少を開始すると、プレゼンターを埋めるのが早く)。
ここで使用されている実装は、このPro RailScast 。基本的な考え方は、オブジェクトクラスに基づいてクラス名を扱う#present
ヘルパーを持つことです。
他の人気の代替案は、デコレータの概念を使用するが、プレゼンターは基本的にデコレータである。
他のヒント
あなたが見ているメインコードの匂いは、と呼ばれています。多くのプログラミング「法律」、「デメテルのガイドライン」などのように考えるべきです。
あなたができることは、実際の計算ステップをカテゴリのメソッドに移動します。
class Category < ActiveRecord::Base
def transaction_amount
transactions.sum("amount_cents")
end
end
<% categories.each do |c| %>
....
<%= c.transaction_amount %>
....
<% end %>
.
所属していません StackOverflow