两个模型相互依赖 - 捕获22

时间:2012-03-07 02:18:22

标签: ruby-on-rails database ruby-on-rails-3

以下是我的情景:

名为Course的模型有许多CourseCodes。 CourseCode属于课程。 如果没有课程,则无法创建CourseCode,并且如果没有至少一个CourseCode,则无法创建课程。

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

3 个答案:

答案 0 :(得分: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 :(得分:-1)

对我来说很好看。删除validates_presence_of :course可能会让您的工作变得更轻松,因为它往往会妨碍您添加更多内容。

创建课程时,请执行以下操作:

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

ActiveRecord会解决问题。

答案 2 :(得分:-1)

您可以将unless添加到您计划首先创建的模型中。例如:

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