红宝石-订购group_by集合描述?

时间:2019-02-28 16:51:47

标签: ruby-on-rails

我收集了用户购买的产品的集合,按用户名称分组,因此我可以计算出独特商品的数量以及每种商品的购买数量:

控制器:

@line_items = Spree::LineItem.joins(:order).where(spree_orders: {state: "complete"})
@products = @line_items.group_by(&:name)

查看:

<% @products.each do |name, line_items| %>
     <%= name %> - <%= line_items.count %><br>
<% end %>

是否可以对.each循环进行排序,使其以line_items.count降序?

谢谢

1 个答案:

答案 0 :(得分:1)

直接从db获取正确的数据会更好:

@products = @line_items.group(:name).order("count_all DESC").count

这将直接为您提供名称和计数,例如

# => { "line_1" => 3, "line_2" => 2, "line_3" => 8 }

这里有一些Rails魔术在起作用:使用groupordercount生成的SQL看起来像:

  

SELECT COUNT(*) AS count_all, name AS name FROM spree_line_items GROUP BY name ORDER BY count_all DESC

这是count_all的来源:Rails自动将其附加到计数列。

然后,您可以将其直接插入视图:

<% @products.each do |name, line_item_count| %>
  <%= name %> - <%= line_item_count %><br>
<% end %>

或者,如果您在其他地方使用实例变量,这是一个简单的Ruby解决方案:

@products = @line_items.group_by(&:name).sort_by { |_k, line_items| line_items.count }.reverse

这仅使用sort_by来获取按相关计数排序的记录,然后反向获取降序排列。 here的使用有很好的基准。

希望有帮助-如有任何疑问,请告诉我。