在Rails中的group_by中添加值

时间:2011-04-19 15:56:32

标签: ruby ruby-on-rails-3

我正在为作者制作季度版税报告。我有一个报告模型(没有数据库表支持),我用它来显示基于年份和季度的特定作者的报告。我将其路由到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.我尝试了数组#injection,但我没有理解语法。

并且,所有人都说......我确信我的工作量超出了我的需要。我从模型中的很多控制器代码开始,但是有很多undefined method错误。任何建议或帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我同意您需要重构您的代码,而我只是针对您的具体问题提供这些答案 - 这些不是我的总体建议。

第一个问题

请记住,这是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 } %>