我正在显示一个items
的列表,该列表在HTML表格中具有price
属性。
获得总计price
添加表格末尾的正确方法是什么(计算应该在哪里)?
我可以想到3种显而易见的方法,但我不知道哪种方式最“正统”
1-控制器
@items = Item.all
@item_total = @items.sum(:price)
我只是在最后一行显示@item_total
2-在视图中,在最后一行
<%= @items.sum(:price) %>
但我不确定在视图中执行此操作是否可行(它有效,但是可以吗?)
3-在视图中,在最后一行添加
<%= @items.inject(0){|s, e| s + e.price} %>
但是在视图中添加这种逻辑并不合适。
那么哪一个是正确的呢?还是我还有另一种方法?
答案 0 :(得分:1)
您应该使用第一个选项,因为视图应包含最少的代码。 因此,仅在控制器中使用您的代码。
答案 1 :(得分:1)
@items = Item.all
# this is Array#sum, calculation is done in Ruby. usually slow
@items.sum(:price)
,而
# this is Relation#sum -> does a calculation at DB. usually faster
Item.scoped.sum(:price) # OR Item.sum(:price)
答案 2 :(得分:1)
总是希望减少从数据库中获取数据所需的查询数量.... 您有两种方法可以获取数据......
@items = Item.all @item_total = @ items.sum(:price)
这不会运行,因为应该有&amp;:price而不是:price ...如果由于不支持ARel而现在不鼓励这种代码风格...更多...
因此,根据我应该使用的代码
@items = Item.scoped @item_total = @ items.pluck(:price).sum(:price)
好处是@item是一个ARel对象,可以用于进一步的计算...
答案 3 :(得分:0)
试试这种方式
# In your controller write
@item_total = Item.sum(:price)
和@item_total
在您的view
文件中使用
<强>更新强>
如果您使用index
行动,则可以这样做
@items = Item.all
@item_total = @items.sum(:price)
但是如果您只想item_total
,那么不要传递两个查询,您可以这样做
@item_total = Item.sum(:price)
答案 4 :(得分:0)
您可以尝试以下代码:
Sum Dolars: <%= @customer_reports.sum(&:mount) %>