2012-03-07 11 views
1

ここに私のシナリオがあります:2つのモデルが互いに依存している - キャッチ22

コースと呼ばれるモデルには多くのコースコードがあります。 CourseCodeはコースに属します。 CourseCodeをCourseなしで作成することはできず、少なくとも1つのCourseCodeなしでCourseを作成することはできません。

class Course < ActiveRecord::Base 
    has_many :course_codes 
    validate :existence_of_code 
private 
    def existence_of_code 
    unless course_codes.any? 
     errors[:course_codes] << "missing course code" 
    end 
    end 
end 

class CourseCode < ActiveRecord::Base 
    belongs_to :course 
    validates_presence_of :course 
end 

全体のシナリオは、キャッチ22 のようなビットは、同じ時間の両方を作成する方法はあります感じていますか? 私はRails 3.2を使用しています

+0

CourseCode *にコースが添付されているのはなぜですか?後でコースを追加するためのプレースホルダとしてCourseCodeを作成するのは大丈夫でしょうか? – Andrew

答えて

1

accepts_nested_attributes_forを使用して問題を解決しました。

ネストされた属性を使用すると、親を介して関連付けられたレコードの属性を保存できます。デフォルトではネストされています。このように使用

class Course < ActiveRecord::Base 
    has_many :course_codes, inverse_of: :course 
    validate :existence_of_code 

    accepts_nested_attributes_for :course_codes 

private 
    def existence_of_code 
    unless course_codes.any? 
     errors[:course_codes] << "missing course code" 
    end 
    end 
end 

class CourseCode < ActiveRecord::Base 
    belongs_to :course, inverse_of: :course_codes 
    validates_presence_of :course 
end 

Course.create!({ 
    course_codes_attributes: [{ code: "TDA123" }], 
    # ... 
}) 
-1

私によく見えます。 validates_presence_of :courseを削除すると、あまりにも簡単になる可能性があります。それは、あまり追加しなくなる傾向があるためです。あなたがコースを作成するとき

、このようにそれを実行します。

Course.create course_codes: [CourseCode.new(...), CourseCode.new(...)] 

ActiveRecordのは、物事を把握します。

+0

@ Andrewの答えに対するコメントを参照してください。 – Oleander

-1

最初に作成する予定のモデルにunlessを追加できます。たとえば、

class CourseCode < ActiveRecord::Base 
    belongs_to :course 
    validates_presence_of :course, :unless => lambda { Course.all.empty? } 
end 
+0

実際には 'Course'がなくても' CourseCodes'は欲しくないということです。 – Oleander

+1

CourseCodeはCourseの属性ですか?コースコードでCourseCodeを文字列または整数にしないのはなぜですか? – Andrew

+0

説明したように、あなたの状況はプログラミングだけでなく現実には理論的に不可能です。最初に作成するために1つを選択してから、関連する2つ目のものを作成する必要があります。たとえあなたがペンと紙でこれをやったとしても、あなたが最初と2番目のことをしたときの間に2番目の遅れがあります。 – Andrew

関連する問題