挑战计算动态构建的请求的总和。
我使用每种方法为每个元素获取值,并且它无缝地工作。
<% 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 %>
尝试了多种解决方案但没有运气
答案 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
的列的总和,其中n
是params[: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