Запросить все записи, которые не содержат конкретной ассоциации - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть 3 модели:

Questions
-- belongs_to :user
-- has_many :answers
Answers
-- belongs_to :user
-- belongs_to :question
Users
-- has_many :questions
-- has_many :answers

Как запросить все вопросы, на которые пользователь не ответил?

Я пытался что-то подобное, но он не возвращает никаких вопросов:

Question.includes(:answers).where.not( :answers => { :user_id => current_user.id } )

Обновление

Закончилось делать что-то вроде этого:

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

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

class Question < ActiveRecord::Base
  has_many :answers
  has_many :users, through: :answers
end

Тогда я могу получить вопросы без ответа, используя:

@answered = current_user.questions
@unanswered = Question.all - @answered_questions

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Левое объединение спасает мир !!!

Question.includes('left join answers on answers.question_id = questions.id').
includes('left join users on users.id = answers.user_id').
where( users: { id: nil } )
0 голосов
/ 25 февраля 2019

Ваша ассоциация должна быть такой, как

Users
-- has_many :questions
-- has_many :answers, through: :questions
Questions
-- belongs_to :user
-- has_many :answers
Answers
-- belongs_to :question
-- delegate :user, to: :question

Не нужно, чтобы в таблице answers Foreign_key user_id.Удалите его, используя миграцию.

Зачем нужны изменения, как указано выше?

  1. Ненужная процедура хранения foreign_key user_id во вложенном отношении.

  2. Что если у нас есть ответы на вопрос и пользователя, где соответствующий вопрос не принадлежит соответствующему пользователю.Следуйте OOAD при сопоставлении зависимых таблиц.Читать Rails Ассоциация ActiveRecord

...