我的应用程序的申请人包含许多question_sections,其中包含很多问题以及许多答案。
我在这里为申请人退回这些
@question_sections = QuestionSection.find(
:all, :include => {:questions => :answers},
:conditions => ['answers.application_form_id is NULL OR answers.application_form_id = ?', @application_form.id],
:order => 'question_sections.list_index ASC, questions.list_index ASC'
)
我想做的是即使答案行为空(即答案中的左连接)也会返回一行,这样我们就可以找出尚未回答的问题而不是完全省略它们(这就是发生的事情)目前。)
我认为问题可能是答案既属于问题又属于申请人;
class Answer < ActiveRecord::Base
belongs_to :question
belongs_to :application_form, :touch => true
所以,伪代码我想'belongs_to:application_form IF:application_form不为空' - 保留任何潜在的关联。
虽然我可以很容易地用SQL编写所有这些内容,但我想让rails处理它并修复模型。
在SQL中我想从这个
开始FROM `question_sections`
LEFT OUTER JOIN `questions` ON questions.question_section_id = question_sections.id
LEFT OUTER JOIN `answers` ON answers.question_id = questions.id
WHERE ((answers.application_form_id IS NULL
OR answers.application_form_id = 656))
到这个
FROM `question_sections`
LEFT OUTER JOIN `questions` ON questions.question_section_id = question_sections.id
LEFT JOIN `answers` ON answers.question_id = questions.id AND answers.application_form_id = 656
// No WHERE
感谢。
编辑
我认为,我需要的是has_many协会的lambda。就像是;
has_many :answers_and_null_answers, :whatever => lambda ( a = Answer.find(n); if a.nil? a = Answer.new; )
显然,那只是杂乱的假 - 但这可能吗?
编辑#2
啊哈! first_or_create做我想要的,但似乎你可以做到:包括。我假设我可以对模型做些什么来允许这个?
答案 0 :(得分:0)
我使用的解决方案是将原始SQL添加到find()调用。手动编写我的连接,然后编辑视图以适应不同的输出。
不是我喜欢做的,但它确实有效。