在Rails中添加group_by中的值



我正在为作者制作季度版税报告。我有一个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 } %>

相关内容

  • 没有找到相关文章