Forum: Rails France Grouper

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
big c. (Guest)
on 2008-12-02 13:11
(Received via mailing list)
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
guillaume belleguic (Guest)
on 2008-12-02 13:19
(Received via mailing list)
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.
big c. (Guest)
on 2008-12-02 13:55
(Received via mailing list)
Merci pour la réponse,
Malheureusement je ne comprends toujours pas comment faire



2008/12/2 guillaume belleguic <removed_email_address@domain.invalid>
guillaume belleguic (Guest)
on 2008-12-02 14:41
(Received via mailing list)
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>
Cyril M. (Guest)
on 2008-12-02 15:05
(Received via mailing list)
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
big c. (Guest)
on 2008-12-02 15:54
(Received via mailing list)
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 +
big c. (Guest)
on 2008-12-02 16:55
(Received via mailing list)
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>
big c. (Guest)
on 2008-12-02 17:20
(Received via mailing list)
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. <removed_email_address@domain.invalid>
big c. (Guest)
on 2008-12-02 17:32
(Received via mailing list)
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 %>
  <br />
  <% wines.each do |w| %>
    <%= w.name %><br />
  <% 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>
guillaume belleguic (Guest)
on 2008-12-02 17:46
(Received via mailing list)
@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>
big c. (Guest)
on 2008-12-02 17:53
(Received via mailing list)
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| %>
  <li>
    <a><%= region.name %></a>
    <ul>
    <% regions_wines.group_by(&:color).each do |color, colors_wines| %>
      <li>
        <%= color %>
        <ul>
        <% colors_wines.group_by(&:appellation).each do |appellation,
appellations_wines| %>
          <li>
            <%= appellation.name %>
            <ul>
            <% appellations_wines.each do |wine| %>
              <li><%= wine.name %></li>
            <% end %>
            </ul>
          </li>
        <% end %>
        </ul>
      </li>
    <% end %>
    </ul>
  </li>
<% end %>
</ul>

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 <removed_email_address@domain.invalid>
guillaume belleguic (Guest)
on 2008-12-02 19:02
(Received via mailing list)
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>
This topic is locked and can not be replied to.