2010-11-22 5 views
1

Dans un État, nous avons Shops, avec la colonne de base de données type dans chaque entrée de magasin: épicerie, Mode et alimentaire.séparés « chacun » à « types » en vue Rails

Je le code suivant:

<% @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 %> 

Dans le code ci-dessus, tous les commerces seront listés selon les ID croissant:

Shop ID1 (Type = Food) 
Shop ID2 (Type = Fashion) 
Shop ID3 (Type = Grocery) 
Shop ID4 (Type = Fashion) 
Shop ID5 (Type = Food) 

Au lieu de sortir each, je voudrais montrer à le type préféré pour:

Fashion 
Shop ID2 
Shop ID4 

Grocery 
Shop ID3 

Food 
Shop ID1 
Shop ID5 

J'ai essayé d'utiliser l'instruction if state.shops.type == 'Fashion', mais cela ne fonctionne pas. Quelle est la bonne façon d'écrire cela?

Merci.

Répondre

1

Utilisez la méthode 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 %> 
+0

Je voudrais avoir l'ordre de types à. Exemple, je veux la mode d'abord, puis l'épicerie, puis la nourriture. – Victor

+0

Faites ceci: 'state.shops (: order => 'type ASC'). Group_by (&: type)' – wuputah

+0

@wuputah, votre commande se traduirait par Mode, Nourriture, Épicerie à la place. Je ne serai pas en mesure de faire une commande personnalisée. – Victor

0

Suite aux commentaires précédents, il ne semble pas y avoir de logique à l'ordre que vous voulez. Donc soit vous devez implémenter un attribut d'ordre comme un entier que vous pouvez utiliser pour trier par dans la requête. Sinon, vous devrez créer un bloc qui va faire des contrôles statiques et faire le tri sur mesure, peut-être quelque chose comme ceci:

@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| %> 

Comme vous le voyez, il est un peu en désordre et je voudrais donc probablement ajouter un attribut de commande comme je l'ai mentionné et puis faire comme wuputah dit mais changer pour

state.shops(:order => "order ASC").group_by(&:type) 
Questions connexes