J'ai essayé de résoudre ce problème pendant quelques heures maintenant et je n'ai pas réussi à trouver une solution propre. Il semble que je ne suis pas trop bon avec les rails ...Comment trier des objets dans une relation many-to-many en ruby on rails?
Quoi qu'il en soit, je donne les résultats suivants:
Dans le code:
class Article < ActiveRecord::Base
has_many :line_aspects
has_many :aspects, :through => :line_aspects
#plus a 'name' field
end
class LineAspect < ActiveRecord::Base
belongs_to :article
belongs_to :aspect
#plus a 'value' field
end
class Aspect < ActiveRecord::Base
has_many :line_aspects
has_many :articles, :through => :line_aspects
#plus a 'name' field
end
Maintenant, ce que je voudrais faire, est de les trier en deux étapes. Première sorte d'articles par leur Articles.name, puis à l'intérieur de les trier par Aspect.name (note, pas l'intermédiaire).
Par exemple, par ordre alphabétique (désolé si la notation est incorrect):
[{
article => 'Apple',
line_aspects => [
{:value => 'red'}, #corresponding to the Attribute with :name => 'color'
{:value => 'small'} #corresponding to the Attribute with :name => 'shape'
]
},{
article => 'Watermelon',
line_aspects => [
{:value => 'green'}, #corresponding to the Attribute with :name => 'color'
{:value => 'big'} #corresponding to the Attribute with :name => 'shape'
]
}]
Encore une fois, notez que ceux-ci sont commandés par le nom d'aspect (couleur avant la forme) au lieu des valeurs spécifiques de chaque ligne (rouge avant vert). Mon intention est de les afficher dans une table dans la vue.
Avec ce résultat:
Ce code J'utilise:
<table>
<tr>
<th>Category</th>
<% @articles.each do |article| -%>
<th><%= link_to article.name, article -%></th>
<% end -%>
</tr>
<% @aspects.each do |aspect| -%>
<tr>
<td><%= aspect.name -%></td>
<% aspect.line_aspects.each do |line_aspect| -%>
<td><%= line_aspect.value %></td>
<% end -%>
</tr>
<% end -%>
</table>
Je n'ai pas trouvé une bonne façon de le faire dans des rails encore (sans avoir recours à N requêtes). Quelqu'un peut-il me dire un bon moyen de le faire (même en changeant la vue, si mon approche est fausse)?
(j'ai trouvé un similar question in hyphen)
MISE À JOUR: Voici comment je le ferais dans SQL:
SELECT line_aspects.value FROM line_aspects, aspects, articles
WHERE articles.id = line_aspects.article_id
AND aspects.id = line_aspects.aspect_id
ORDER BY aspects.name, articles.name
Mais je voudrais faire le chemin des rails.
MISE À JOUR: Ajout du code de vue. Ce qui pourrait exposer ma situation un peu mieux.
J'ai deux solutions pour trier plusieurs à-plusieurs. voir [la question similaire] (http://stackoverflow.com/questions/10417901/rails-how-to-sort-many-to-many-relation/43781591#43781591) –