В рельсах при сохранении объекта active_record также будут сохранены связанные с ним объекты. Но ассоциации has_one и has_many имеют разные порядки сохранения объектов.
У меня есть три упрощенные модели:
class Team < ActiveRecord::Base
has_many :players
has_one :coach
end
class Player < ActiveRecord::Base
belongs_to :team
validates_presence_of :team_id
end
class Coach < ActiveRecord::Base
belongs_to :team
validates_presence_of :team_id
end
Я ожидал, что при вызове team.save
команда должна быть сохранена перед ассоциированным тренером и игроками.
Я использую следующий код для тестирования этих моделей:
t = Team.new
team.coach = Coach.new
team.save!
team.save!
возвращает true.
Но в другом тесте:
t = Team.new
team.players << Player.new
team.save!
team.save!
выдает следующую ошибку:
> ActiveRecord::RecordInvalid:
> Validation failed: Players is invalid
Я выяснил, что team.save!
сохраняет объекты в следующем порядке: 1) игроки, 2) команда и 3) тренер. Вот почему я получил ошибку: когда игрок спасен, команда еще не имеет идентификатора, поэтому validates_presence_of :team_id
терпит неудачу в игроке.
Может кто-нибудь объяснить мне, почему объекты сохраняются в этом порядке? Мне кажется, это не логично.