2016-06-24 5 views
0
class Question 
    has_many :participants, :class_name => "User" 
end 

class User 
    has_and_belongs_to_many :questions 
end 

Nun enthält, da ein Benutzer, ich will alle Fragen finden, wo der Nutzer hat nicht teilgenommen.Rails Aufzeichnungen finden, wo Beziehung nicht eine ID

So etwas wie Question.where("participants DOES NOT INCLUDE user.id"), aber tatsächlich gültig . Wie würde ich das machen?

+0

Ihre Beziehung scheint, wie es entweder ein 'has_and_belongs_to_many' oder ein' has_many through' Beziehung sein sollte. Wie Sie es geschrieben haben, sollte der Benutzer eine Assoziation "gehört zu: Frage" haben, was keinen Sinn ergibt - jeder Benutzer hätte an einer einzigen Frage teilgenommen. Können Sie den relevanten Teil Ihres Benutzermodells posten? –

+0

@RobertNubel aktualisiert – Snowman

Antwort

0
Question.joins(:participants).where("users.id != ?", user.id) 
+0

Sollte users.id Teilnehmer.ID sein? Warum oder warum nicht? – Snowman

+0

Dies wird nicht korrekt funktionieren. Angenommen, Frage 1 hat zwei Teilnehmer, A und B; Wenn der angegebene Benutzer A ist, wird die Frage 1 trotzdem zurückgegeben, da es einen Teilnehmer (B) hat, der nicht A. –

+0

@RobertNubel ist, was ist mit 'Question.where.not (" participants.id ==? ", @user. id) ' – Snowman

0

Ihre beste Wette - in Bezug auf die Lesbarkeit und composability - ist eine Unterabfrage:

Question.where(
    "NOT EXISTS (SELECT 1 FROM questions_users WHERE question_id=questions.id 
    AND user_id=?)", user.id) 
+0

Geht das von einer neuen Tabelle 'questions_users' aus? – Snowman

+0

Benutzer has_and_belongs_to_many questions .. es besagt, dass die Tabelle "fragues_users" existiert – DennisCastro

+0

Ihre has_and_belongs_to_many-Beziehung sollte diese Join-Tabelle automatisch erstellt haben. Ansonsten könnte jeder Benutzer nur eine Frage haben. –