我正在为作者制作季度版税报告。我有一个Report模型(没有数据库表支持),我用它来显示基于年份和季度的特定作者的报告。我把它路由到author/:author_id/:reports/:year/:quarter
我现在在我的控制器中有一些非常丑陋的代码,为了让事情正常工作。我可以以后再重构:
def show
@author = Author.find(params[:author_id])
#find the orders that took place in the current quarter and year for the report
@orders = Order.get_current_orders(quarter_range, params[:year])
#find only the products that apply for the current author
@author_products = @author.products
#find only the line_items that match the current quarter's orders and the author's products
@line_items = LineItem.find_all_by_order_id_and_product_id(@orders, @author_products)
#group the line items by product
@line_items_by_product = @line_items.group_by { |l| l.product_id }
end
让我在我的视图中做这个:
<%= @line_items_by_product.each do |product, line_item | %>
<h3><%= product %></h3>
<% line_item.each do |line_item| %>
<%= line_item.quantity %> <br />
<% end %>
<% end %>
有两件事我需要解决。现在,product
只返回产品id,而不是标题(它存储在products表中,而不是line_items表中)。显然,我不能访问product.title
,但我需要在分组中获得标题。
我的第二个问题是,不只是循环遍历每个单行项目的数量,我想把每个行项目的数量加起来,然后显示出来。所以不是得到1 10 55…我只要66。我尝试了array#inject,但是我没有掌握语法。
他说了这么多……我肯定我做得太多了。我在模型中开始了很多控制器代码,但有很多undefined method
错误。如有任何建议或帮助,不胜感激。
我同意你需要重构你的代码,我只提供这些特定问题的答案——这些不是我的总体建议。
第一个问题记住这是Ruby,一个Product实例和你当前使用的Integer一样有效。因此,您可以将group_by
调用更改为:
@line_items_by_product = @line_items.group_by { |l| l.product }
…然后将视图更改为…
<h3><%= product.title %></h3>
第二个问题
<%= line_item.sum {|li| li.quantity } %>