在Rails视图中将“each”分隔为“types”

时间:2010-11-22 04:53:17

标签: ruby-on-rails

在州,我们有商店,每个商店条目中都有数据库列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'语句,但不起作用。写这个的正确方法是什么?

感谢。

2 个答案:

答案 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)