2016-05-24 10 views
1

Lets sagen, ich habe drei Modelle.Schienen: kreisförmig Viele zu viele Beziehung zwischen 3 Tabellen

  • Benutzer (kann viele Fragen schreiben)
  • Frage (viele Antworten haben)
  • Antwort (Benutzer kann viele Antworten posten)

Jetzt kann ich erstellen Assoziation wie:

class User < ActiveRecord::Base 
    has_many :questions 
    has_many :answers 
end 

class Question < ActiveRecord::Base 
    belongs_to :user 
    has_many :answers 
end 

class Answer < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :question 
end 
Jetzt 210

, wenn ich das tun, dann nach Antworten von jedem Benutzer für eine bestimmte Frage Abfrage zu finden sein wird:

@answers = User.find(params[:id]).answers.where(:question_id => params[:question_id]) 

Gibt es eine bessere Lösung? Muss ich den Verein ändern oder ist es so?

+0

Hängt es ab, schreiben die Benutzer immer in ihren eigenen Antworten oder sollten dort voreingestellte Optionen? Benötigen Sie eine Benutzeroberfläche für Benutzer zum Erstellen von Fragen? – max

+0

@max, Ja Benutzer haben eine Schnittstelle zum Erstellen/Aktualisieren ihrer Frage. Außerdem können sie ihre eigene Frage beantworten. – Emu

+1

Ihre Lösung sieht für mich optimal aus. Haben Sie Bedenken? –

Antwort

0

Wenn Sie Benutzer müssen in der Lage sein, von einem crud Schnittstelle erstellen Umfragen mit Fragen und vorgegebenen Antworten als diese Beziehungen sind nur werde es nicht schneiden. Es ist auch nicht sehr optimal, wenn Sie Metriken generieren möchten - wie die häufigsten Antworten sagen.

Verwenden Sie stattdessen separate Tabellen für die Antwort "Voreinstellungen" und die Antworten der Beantworter.

class User < ActiveRecord::Base 
    has_many :questions 
    has_many :replies 
    has_many :selected_answers, through: :replies, 
           source: :answer 
    has_many :answered_questions, through: :replies, 
           source: :question 
end 

class Question < ActiveRecord::Base 
    belongs_to :user 
    has_many :answers 
    has_many :replies, through: :answers 
end 

# this is a "preset" 
class Answer < ActiveRecord::Base 
    belongs_to :question 
    has_many :replies 
end 

# this is the answer checked by a user 
class Reply < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :answer 
    has_one :question, through: :answer 
end 
1

Ja, da Sie Benutzer Fremdschlüssel auf Antworten haben, können Sie einfach tun:

@answers = Answer.where(user_id: params[:id], question_id: params[:question_id]) 
+0

ja das ist ein Weg. Aber ist dies die beste Lösung für das Szenario? (+1) – Emu

+0

"Beste Lösung" ist subjektiv und schwer zu beweisen, aber es ist schwer, etwas einfacher als das für die angegebenen Modellbeziehungen zu verstehen - es ist nur eine Single-Table-Abfrage auf zwei Parameter, die beide benötigt werden das Ergebnis. Das Beispiel in Ihrer Frage funktioniert, ist jedoch komplizierter und enthält eine unnötige Verknüpfung. –

Verwandte Themen