0

私が参加し、テーブルを使用して2つのモデル間の多くの関係に多くを作成するためのチュートリアルとして、このrailscast #17 revisedで探しています:のRails:多くの関係に多くの - 新しいレコードを作成し、関連付ける

class Course < ActiveRecord::Base 
has_many :courselocalizations 
has_many :courselocations, through: :courselocalizations 
end 

class Courselocation < ActiveRecord::Base 
has_many :courselocalizations 
has_many :courses, through: :courselocalizations 
end 

class Courselocalization < ActiveRecord::Base 
belongs_to :course 
belongs_to :courselocation 
end 

ユーザーの場合courseを編集または作成するときに既存のcourselocationが表示されない場合は、新しいcourselocationを作成して自動的に関連付けるのに最適な方法は何ですか?

答えて

0

これは、2段階のプロセス(私が推奨する方法)で行うことも、1ステップで行うこともできます。

2段階のプロセス: - CourseLocation を作成 - CourseLocationCourseを関連付けます。

course_location1 = CourseLocation.create(name: 'location1') 
course.course_locations << course_location1 


あなたはそれがアクティブレコードaccepts_nested_attributes_formethodを使用して可能である1つのステップでこれを実行したい場合は、これは少しトリッキーです。ここgood articleはそれにあるが、のは、手順を打破してみましょう:

  1. コースはコースの局在化はコースを作成する場合は、course_location
  2. の属性を受け入れる属性を渡す必要がcourse_localizations
  3. の属性を受け入れる必要があります場所の属性を含むローカライゼーションのためのものです。

あなたの特定のケースのためにすべてのことを設定できます:この時点で

class Course < ActiveRecord::Base 
    # attribute subject 
    has_many :course_localizations, inverse_of: :course 
    has_many :course_locations, through: :course_localizations 
    accepts_nested_attributes_for :course_localizations 
end 

class CourseLocation < ActiveRecord::Base 
    # attribute city 
    has_many :course_localizations 
    has_many :courses, through: :course_localizations 
end 

class CourseLocalization < ActiveRecord::Base 
    belongs_to :course 
    belongs_to :course_location 
    accepts_nested_attributes_for :course_locations 
end 

あなたは

course = Course.new(
    subject: "Math", 
    course_localizations_attributes: [ 
    { course_location_attributes: { city: "Los Angeles" } }, 
    { course_location_attributes: { city: "San Francisco" } }] 
) 

course.save 
+0

のおかげでできるはずです!私は 'course' new/editビューでフォームビルダーを使って' accepts_nested_attributes_for'をテストし、コースコントローラの新しいアクション内に '1 times {@ course.courselocations.build}'を追加しました。私がやることは、すでにコースの場所がない場合にフォームをajax経由で読み込むことです。 'courselocalizations'モデルに' accepts_nested_attributes_for:course_locations'を追加する目的は何ですか? –

+0

'course_location'属性を' course_localizations'モデルに渡すことができ、 'course_locations'属性に渡されることを明示しています。属性を2層深く渡す必要があります。すでにajaxを設定している場合は、accepts_nested_attributes_forを使用せず、2つの別々のAPIリクエストを作成することを真剣に検討します。幸運 – Correlator

+0

ありがとう - ajax形式で 'accepts_nested_attributes_for'を使用することの欠点は何ですか?また、2つの別々のAPIリクエストとして言及している場合は、上記の2つのステップのプロセスをどのように使用するのかはわかりません。 –

関連する問題