0

我正在显示一个列表,items其中包含price一个 HTML 表中的属性。

将总数添加到表格末尾的正确方法是什么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} %>

但是在视图中添加这种逻辑感觉不对。

那么其中哪一个是正确的呢?还是我想念另一种方式?

4

5 回答 5

1

您应该使用第一个选项,因为视图应该包含最少的代码。因此,仅在控制器中使用您的代码。

于 2012-11-03T12:01:48.480 回答
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)
于 2012-11-03T12:15:19.033 回答
1

总是希望减少从数据库中获取数据所需的查询数量......您有两种选择来获取数据......

@items = Item.all @item_total = @items.sum(:price)

这将不会运行,因为应该有 &:price 而不是 :price...如果由于不支持 ARel 而现在不鼓励这种代码风格...

因此,根据我的说法,您应该使用的代码

@items = Item.scoped @item_total = @items.pluck(:price).sum(:price)

好处是 @item 是一个 ARel 对象,可以在进一步的计算中使用......

于 2012-11-03T12:27:59.607 回答
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)
于 2012-11-03T11:38:14.597 回答
0

你可以试试这段代码:

Sum Dolars: <%= @customer_reports.sum(&:mount) %>
于 2013-08-06T21:52:58.150 回答