0

我的应用程序的申请人有很多 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 is not null' - 保留任何潜在的关联。

虽然我可以很容易地用 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 做我想做的事,但似乎你可以在 :includes 上做。我假设我可以对模型做些什么来允许这样做?

4

1 回答 1

0

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

不是我更愿意做的,但它确实有效。

于 2013-07-30T01:23:52.750 回答