Rails 4如何计算动态查询的总和

时间:2016-09-20 04:04:05

标签: ruby-on-rails ruby-on-rails-4 sum

挑战计算动态构建的请求的总和。

我使用每种方法为每个元素获取值,并且它无缝地工作。

 <% params[:car].map{|n| n.first}.each do |p|%>
   <%= @salon.price.send("price_" + p) %>
 <% end %>

但是,我试图动态获得总和(&#34;价格_&#34; + p)构建的查询失败。

<%= @salon.price.where("price_" + params[:car].map{|n| n.first}.to_s).all %>

尝试了多种解决方案但没有运气

3 个答案:

答案 0 :(得分:1)

你有where但是却没有给出一个真实的类似条款,你的意思是@salon.price.sum()吗?否则你想要过滤什么(where用于过滤,sum用于求和)。

所以你似乎想要做的是:

  • 了解给定沙龙的所有价格
  • 总结列price_0..price_n

正确?

现在可以轻松构建查询以总结单个列的值

为此,你尝试这样的事情:

<%= @salon.price.sum("price_0") %>

这使用适用于任何Active Record关联的Rails sum方法。

如果您有一个单个价格对象,并希望总结该单个价格的所有price_X列,那么您可以使用以下内容:

<%= params[:car].map{|n| price.send("price_" + n.first.to_s) }.sum %>

这会将params[:car]中的数字转换为给定price-object的列值数组...然后使用来自{{sum的{​​{1}}方法在最后对它们求和1}} class(AKA Array

所以要将这两者结合起来,你可能需要这样的东西:

Array#sum

是的,这是一个街区内的一个街区。

现在<%= @salon.prices.all.sum{|price| params[:car].map{|n| price.send("price_" + n.first.to_s) }.sum } %> 的Active Record版本可能会干扰sum,而不是像上面那样(看起来更像是你{{1} }})。轨道&#39; Array#sum希望您将第一个示例中的单个列的名称传递给它,而不是像第二个示例中那样传递一个块。因此,有时您需要使用Array#sum(将您的值集合转换为数组),然后您可以在最后使用sum,如下所示:

map

这是一个块(其值被求和)在另一个块(其值被求和)内

编辑: 在讨论之后,你似乎只有一条Array#sum条记录......并且该单条记录上有多列...这会改变一些事情并使它们变得更加简单。你可以使用它:

<%= @salon.prices.all.map{|price| params[:car].map{|n| price.send("price_" + n.first.to_s) }.sum }.sum %>

答案 1 :(得分:0)

您对数组使用 sum 方法

  sum = params[:car].map{|n| n.first}.sum 

答案 2 :(得分:0)

我猜测你正试图在price_n表格中获取名为Price的列的总和,其中nparams[:car].map(:&first)的值。所以我认为简单的解决方案是:

<% params[:car].map(&first).each do |n| %>
  <% sum += @salon.price.send("price_#{n.to_s") %>
<% end %>

<%= sum %>

但是看到视图中的逻辑不是最佳实践,所以如果我们在你的帮助方法中移动整个逻辑会更好。所以在视图中,只显示以下代码:

<%= total_of_all_prices(params[:car], @salon.price) %>

然后在你的助手方法中添加这个方法

def total_of_all_prices(car_params, price_object)
  sum = 0

  car_params.map(&:first).each do |n|
    sum += price_object.send("price_#{n.to_s}")
  end

  sum
end