Две модели зависят друг от друга - поймать 22 - PullRequest
1 голос
/ 07 марта 2012

Вот мой сценарий:

Модель с названием Course имеет много CourseCodes.Код курса принадлежит Курсу.CourseCode не может быть создан без Course, и курс не может быть создан без хотя бы одного 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 ]

1 голос
/ 08 марта 2012

Решил проблему с помощью 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" }],
  # ...
})
0 голосов
/ 07 марта 2012

Вы можете добавить unless к любой модели, которую планируете создать в первую очередь.Например:

class CourseCode < ActiveRecord::Base
  belongs_to :course
  validates_presence_of :course, :unless => lambda { Course.all.empty? }
end
0 голосов
/ 07 марта 2012

выглядит хорошо для меня. Удаление validates_presence_of :course может также облегчить вам задачу, так как это будет мешать, а не добавлять много.

Когда вы создаете курс, делайте это так:

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

ActiveRecord все выяснит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...