Rails ActiveQueryInterface - PullRequest
       0

Rails ActiveQueryInterface

0 голосов
/ 10 мая 2018

Я сталкиваюсь с проблемой, когда пытаюсь написать запрос рельсов с помощью соединений.

То, что я создаю, - это хеш, в котором кандидаты-ответчики сгруппированы в соответствии с разделами данного вопроса. (N.B. У меня есть пул вопросов, откуда некоторые из них добавляются в различные разделы бумаги для вопросов)

Я достиг своего решения, используя карту как:

exam_candidate.exam.question_paper.sections.includes(:questions).each do |section|
  if section.questions.present?
    section_question_hash[section] = candidate_answers.where(question_id: section.questions.map(&:id))
  end
end

Так как использование вышеизложенного создает множество запросов к базе данных, работающих в фоновом режиме, его использование нецелесообразно, и поэтому мне нужно использовать объединения. Кроме того, я могу написать SQL-запрос для того же, что и

select b.name, group_concat(c.id) from sections b
left join question_papers_questions a on a.section_id = b.id 
left join candidate_answers c on a.question_id = c.question_id 
where a.question_paper_id = 3 and c.exam_candidate_id = 4 
group by (b.name)

Но хотя я пытаюсь сделать то же самое в рельсах, у меня много проблем с этим.

Вот моя структура модели:

class ExamCandidate < ActiveRecord::Base
  belongs_to :exam
  belongs_to :candidate
  has_many :candidate_answers, dependent: :delete_all
  accepts_nested_attributes_for :candidate_answers
end

class Exam < ActiveRecord::Base
  has_many :exam_candidates, dependent: :destroy
  has_many :candidates, through: :exam_candidates
  belongs_to :question_paper
end

class QuestionPaper < ActiveRecord::Base
  has_many :exams, dependent: :nullify
  has_many :exam_candidates, through: :exams
  has_many :questions, through: :question_papers_questions
  has_many :question_papers_questions
  has_many :sections, dependent: :destroy
end

class QuestionPapersQuestion < ActiveRecord::Base
  belongs_to :question
  belongs_to :question_paper
  belongs_to :section
end

class Question < ActiveRecord::Base
  has_many :candidate_answers, through: :answers
  has_many :exams, through: :question_papers
  has_many :exam_candidates, through: :exams
  has_many :question_papers_questions
  has_many :question_papers, through: :question_papers_questions
end

class Section < ActiveRecord::Base
  belongs_to :question_paper
  has_many :questions, through: :question_papers_questions
  has_many :question_papers_questions
end

class CandidateAnswer < ActiveRecord::Base
  belongs_to :exam_candidate
  belongs_to :question
end

Я уделил этому достаточно времени, но быть новичком в рельсах - мой недостаток, если кто-то может попробовать или предложить что-то, это будет очень полезно.

1 Ответ

0 голосов
/ 17 мая 2018
sections = exam.question_paper.sections.select("sections.name, group_concat(candidate_answers.id) as candidate_answer_ids")
  .joins(:question_papers_questions).joins("inner join candidate_answers on question_papers_questions.question_id = candidate_answers.question_id")
  .where(candidate_answers: {exam_candidate_id: id}, question_papers_questions: { question_paper_id: exam.question_paper_id })
  .group("sections.name")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...