私のアプリには、多くの回答を持つ多くの質問を持つ多くの 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'
)
私がやりたいことは、回答行が null (つまり、回答の左結合) であっても行を返すことです。これにより、回答されていない質問を完全に省略するのではなく、特定することができます (これが現在行われていることです)。
問題は、答えが質問と申請者の両方に属しているということかもしれません。
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 関連付けのラムダだと思います。何かのようなもの;
has_many :answers_and_null_answers, :whatever => lambda ( a = Answer.find(n); if a.nil? a = Answer.new; )
明らかに、それは単なる乱雑な擬似ですが、これは可能ですか?
編集#2
あはは!first_or_create は私が望むことを行いますが、:includes でそれを行うことができるようです。これを可能にするためにモデルにできることがあると思いますか?