1

FormResponse がbelongs_toあります。フォーム、次にhas_many質問:

class FormResponse < ActiveRecord::Base
   belongs_to :form
end

class Form < ActiveRecord::Base
  has_many :form_responses
  has_many :questions
end

class Question < ActiveRecord::Base
end

フォームのコンテキストで多くのことが必要questionsであることに気付いた場合、次のように FormResponse で質問を呼び出すことを好みます。

form_response = FormResponse.find(id)
form_response.questions

利用可能にするためにquestions、ActiveRecord でこれを行うことができます。

class FormResponse < ActiveRecord::Base
   belongs_to :form
   has_many :questions, :through => :form
end

またはインスタントメソッドを使用:

class FormResponse < ActiveRecord::Base
  belongs_to :form

  def questions
     self.form.questions unless self.form.nil?
  end
end

FormResponse で質問を設定することには興味がありません (FormResponse.questions <<や のようなものは必要ありませんFormResponse.questions.build)。フェッチだけです。

メソッドを使用するよりも を使用する利点と、has_many :questions, :through => :formその逆の利点は何ですか? 遅延読み込み、より優れた SQL などの利点はありますか?

AR は、いつ AR リレーションを使用するか、いつ単純に独自のメソッドを記述するかについて経験則を与えていますか?

4

1 に答える 1

0

これは、ActiveRecord よりもカプセル化の問題だと思います。

一般的に、ここで経験則を適用します。

has_many :through実際にリレーションをモデル化したい場合に使用します。

デメテルの法則に違反したり、コードを DRY にしたりしたくない場合は、委任メソッドを実装します。

于 2014-01-07T16:20:30.513 に答える