2016-07-21 6 views
0

Ich erstelle einen benutzerdefinierten Formular-Generator.Komplexe Gruppierung von Schienen nach Assoziationen

A Formular has_many Sections.

A Abschnitt has_many Felder.

A Feld has_many User_Values ​​.

Es gibt eine Spalte auf den User_Values ​​ Tabelle cloned_index genannt. Ich benutze dies, wenn ein Benutzer ein Duplikat eines Abschnitts erstellt, aber die Abschnitte müssen eindeutig sein.

Meine Frage:

Kann mir jemand helfen, eine Abfrage zu schreiben, dass für jeden Abschnitt, gruppieren Sie die Felder, die durch die cloned_index der Benutzerwerte des Feldes.

Ich habe Derzeit:

form.sections.each do |section| section.fields.each do|field| 
    field.user_values.group_by(&:cloned_index) 
end 

Dies funktioniert derzeit nicht und ist sehr schwer zu folgen. Ich bin mir sicher, dass es einen einfachen Weg gibt, dies zu tun, den ich gerade nicht sehe.

+0

Es scheint, Für mich ist das Datenmodell das, was diese Komplikation verursacht. Sind Sie auf dieses Modell beschränkt? Ich würde empfehlen, eine Bridge-Tabelle zwischen field und user_values ​​hinzuzufügen. Sie können auch "durch" Beziehungen nutzen. Ein Formular könnte 'has_many: fields, through:: section' zum Beispiel. Wenn Sie das Geschäftsproblem erklären, kann ich wahrscheinlich eine bessere Empfehlung geben. –

Antwort

0
form.sections.joins(fields: [:user_values]).group("user_values.cloned_index") 

Sie müssen die Tabellen gruppieren sie zusammen join. Die obige Abfrage kehrt das gruppierte sections von cloned_index

Wenn Sie gruppieren mögen dann die fields zusammen mit sections versuchen, gruppiert

fields.joins(:user_values,:section]).where({sections: {form_id: form.id}}).group("sections.id , user_values.cloned_index") 

Diese Felder des Formulars zurückkehrt section ID und cloned_index