rails 2中的条件has_many

时间:2013-07-29 04:54:48

标签: ruby-on-rails model associations

我的应用程序的申请人包含许多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做我想要的,但似乎你可以做到:包括。我假设我可以对模型做些什么来允许这个?

1 个答案:

答案 0 :(得分:0)

我使用的解决方案是将原始SQL添加到find()调用。手动编写我的连接,然后编辑视图以适应不同的输出。

不是我喜欢做的,但它确实有效。