在州,我们有商店,每个商店条目中都有数据库列type
: Grocery ,时尚和食品
我有以下代码:
<% @country.states.each_with_index do |state, i| %>
State <strong><%= i + 1 %></strong>
<% state.shops.each do |shop| %>
=====showing attributes of each shop=====
<% end %>
<% end %>
在上面的代码中,所有商店都将根据ID升序列出:
Shop ID1 (Type = Food)
Shop ID2 (Type = Fashion)
Shop ID3 (Type = Grocery)
Shop ID4 (Type = Fashion)
Shop ID5 (Type = Food)
我希望以首选的each
顺序显示,而不是输出type
:
Fashion
Shop ID2
Shop ID4
Grocery
Shop ID3
Food
Shop ID1
Shop ID5
我尝试使用if state.shops.type == 'Fashion'
语句,但不起作用。写这个的正确方法是什么?
感谢。
答案 0 :(得分:1)
使用group_by
方法:
<% @country.states.each_with_index do |state, i| %>
State <strong><%= i + 1 %></strong>
<% state.shops.group_by(&:type) do |type, shops| %>
<h3><%= type %></h3>
<% shops.each do |shop| %>
=====showing attributes of each shop=====
<% end %>
<% end %>
<% end %>
答案 1 :(得分:0)
根据之前的评论,似乎没有任何你想要的订单的逻辑。因此,您应该实现一个类似于整数的订单属性,您可以使用该属性在查询中进行排序。否则你将不得不创建一个块来进行静态检查并进行自定义排序,可能是这样的:
@custom_order = {"Fashion" => 0, "Grocery" => 1, "Food" => 2}
<% state.shops.group_by(&:type).sort { |a, b|
@custom_order[a.first] <=> @custom_order[b.first]
} do |type, shops| %>
如你所见,它有点乱,所以我可能会像我提到的那样添加一个订单属性,然后就像wuputah说的那样但是改为
state.shops(:order => "order ASC").group_by(&:type)