我收集了用户购买的产品的集合,按用户名称分组,因此我可以计算出独特商品的数量以及每种商品的购买数量:
控制器:
@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
降序?
谢谢
答案 0 :(得分:1)
直接从db获取正确的数据会更好:
@products = @line_items.group(:name).order("count_all DESC").count
这将直接为您提供名称和计数,例如
# => { "line_1" => 3, "line_2" => 2, "line_3" => 8 }
这里有一些Rails魔术在起作用:使用group
,order
和count
生成的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的使用有很好的基准。
希望有帮助-如有任何疑问,请告诉我。