在Rails中向表中添加总和的正确方法是什么?

时间:2012-11-03 11:33:53

标签: ruby-on-rails activerecord sum

我正在显示一个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} %>

但是在视图中添加这种逻辑并不合适。

那么哪一个是正确的呢?还是我还有另一种方法?

5 个答案:

答案 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) %>