Grouper


#1

Bonjour à tous,

Je vais tenter de vous exposer mon problème en essayant d’etre clair, en
gros je n’arrive pas à “lier” certaines tables,

J’ai une table “wines” qui ressemble à ceci :

wines
– id
– name
– color
– region_id
– appellation_id

exemple (1, “Mon vin”, “Rouge”, 1, 1)

J’ai egalement les tables regions et appellations qui ressemblent elles
Ã
ceci :

region
– id
– name

exemple (1, “Bordeaux”)

appellation
– id
– bale

exemple (1, “Chateau du slip”)

Voici ce que je souhaite faire (enfin mon client pas moi)

Afficher

  • Region
    – Couleur
    — Appellation
    ---- Nom du vin

Vu la structure de mes tables, je ne vois pas comment cela est possible
mais
si vous aviez un exemple ou un tuto pour ce genre de truc, je vous en
serez
reconnaissant,

Merci d’avance


#2

bonjour,
tu part de wines et tu groupes les enregistrements trouvé suivant :
region_id
ensuite tu regroupe les tableaux résultant suivant couleur
ensuite tu regroupe les tableaux résultant appelation_id

group_by sur les tableaux pour êtres fainéant mais
pas forcement peformant…

Après ça doit être possible en sql pure.


#3

Merci pour la réponse,
Malheureusement je ne comprends toujours pas comment faire

2008/12/2 guillaume belleguic removed_email_address@domain.invalid


#4

Wines.find(:all).group_by(&: region_id).each do |region_id,
region_wines| region_wines.group_by(&:color).each
do |color, color_wines|
etc, etc
end
end

c’est pas très propre mais ça a le mérite de marché rapidement.

mais il y a d’autre solution, en partant de région tu peux retrouver les
couleurs de tout tes vins et toutes les appellations, avec has_many :
through
2008/12/2 Julien C. removed_email_address@domain.invalid


#5

Julien C. wrote:

– color
– name

Afficher

  • Region
    – Couleur
    — Appellation
    ---- Nom du vin

Tu fais dans le même ordre :

Region.all.each do |r|
puts “- #{r.name}”
r.wines.each do |w|
puts “\t-- w.color”
puts “\t\t — w.appelation.name”
puts “\t\t\t — w.name”
end
end


Cyril M.
http://blog.shingara.fr


#6

Sinon, je me demandais si il n’y avait pas moyen de grouper tout cela
avec
GROUP BY

2008/12/2 Julien C. removed_email_address@domain.invalid


#7

Merci à vous, un grand pas a été franchi,
maintenant je vais tenter de regrouper le tout par région, couleur et
appellation car pour l’instant quand j’essaie d’afficher tout cela j’ai
encore

Bordeaux
Rouge
Haut Medoc
Haut Medoc Rouge 1
Bordeaux
Rouge
Haut Medoc
Haut Medoc Rouge 2
Bordeaux
Rouge
Haut Medoc
Haut Medoc Rouge 3

et je voudrais

Bordeaux
Rouge
Haut Medoc
Haut Medoc Rouge 1
Haut Medoc Rouge 2
Haut Medoc Rouge 3

C’est pas évident à comprendre les blocks en ruby, en tout cas c’est
très
sympa de votre part
Qui sait, il y aura peut etre du boulot pour quelqu’un si je persiste Ã
echouer

A +


#8

Bon je galère toujours autant,

Voici ce que j’ai fait

@region = Region.find(:first, :conditions => ['name = ?', 

‘bordeaux’])

@wines = Wine.find(:all, :conditions => [‘color = ? AND region_id =
?’,
‘rouge’, @region.id],
:order => ‘name ASC’)

@wines = @wines.group_by(&:appellation_id).each do |appellation_id, 

w|

end

Mais ça ressemble à n’importequoi, comment pourrais-je faire pour
sortir
une liste du style

Region
Couleur
Appellation
Vin

Biens sur toutes ces infos (Region, Couleur, Appellation et Vin) ne
doivent
figurer qu’une fois dans cette liste
A les bonnes prises de tête quand on a un niveau de merde comme le mien
ça
fatique :slight_smile:

Merci encore

2008/12/2 Julien C. removed_email_address@domain.invalid


#9

@wines = Wine.find(:all)

<% @wines.group_by(&:region_id) do |region_id, region_wines| %>
<%= Region.find(region_id).name %>
<% region_wines.group_by(&:color) do |color, color_wines| %>
<%= color %>
<% color_wines.group_by(&:appellation_id) do |appellation_id,
appellation_wines| %>
<%= Appellation.find(appellation_id).label %>
<% appellation_wines.each do |appellation_wine| %>
<%= appellation_wine.name %>
<% end %>
<% end %>
<% end %>
<% end %>

2008/12/2 Julien C. removed_email_address@domain.invalid


#10

Désolé de persiter, mais voila, j’ai un peu progréssé

Dans mon controlleur j’ai

@region = Region.find(:first, :conditions => [‘name = ?’, ‘bordeaux’])
@wines = Wine.find(:all, :conditions => [‘color = ? AND region_id = ?’,
‘rouge’, @region.id], :order => ‘name ASC’)

Dans ma vue j’ai

<% @wines.group_by(&:appellation).each do |appellation, wines| %>
<%= appellation.name %>


<% wines.each do |w| %>
<%= w.name %>

<% end %>
<% end %>

Exactement ce que je voulais, par contre, puis-je me servir du premier
exemple donné pour ne pas préciser la région et la couleur comme je l’ai
fait au dessus

Merci

2008/12/2 Julien C. removed_email_address@domain.invalid


#11

Merci guillaume,

J’allais justement répondre, par :

C’est encore moi,

J’ai encore changé de technique,

Dans mon controlleur,

@wines = Wine.find(:all)

dans ma vue

<% @wines.group_by(&:region).each do |region, regions_wines| %>

  • <%= region.name %>
      <% regions_wines.group_by(&:color).each do |color, colors_wines| %>
    • <%= color %>
        <% colors_wines.group_by(&:appellation).each do |appellation, appellations_wines| %>
      • <%= appellation.name %>
          <% appellations_wines.each do |wine| %>
        • <%= wine.name %>
        • <% end %>
      • <% end %>
    • <% end %>
  • <% end %>

    Pas très beau mais je pense que j’ai compris grâce à vous, Donc un
    grand *
    merci* pour m’avoir supporté durant ce thread :slight_smile:

    Ah ruby quand tu nous tiens

    2008/12/2 guillaume belleguic removed_email_address@domain.invalid


    #12

    de rien…
    Il est clair qu’il faudra par la suite trouver une autre solution, car
    les
    vues n’ont pas à faire se genre de traitement, penses y au moment du
    refactoring.

    2008/12/2 Julien C. removed_email_address@domain.invalid