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
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.
Merci pour la réponse,
Malheureusement je ne comprends toujours pas comment faire
2008/12/2 guillaume belleguic [email protected]
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. [email protected]
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.
Sinon, je me demandais si il n’y avait pas moyen de grouper tout cela
avec
GROUP BY
2008/12/2 Julien C. [email protected]
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 +
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
Merci encore
2008/12/2 Julien C. [email protected]
@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. [email protected]
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. [email protected]
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
Ah ruby quand tu nous tiens
2008/12/2 guillaume belleguic [email protected]
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. [email protected]