В направляющих, при сохранении объекта 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
сбои в плеере.
Кто-то может объяснить мне, почему объекты сохраняются в этом порядке? Это кажется не логичным мне.
Вы должны использовать "validates_associated", чтобы выполнить эту
проверку Здесь
Что-то вроде выполнения проверки без проверки
class Team < ActiveRecord::Base
has_many :players
has_one :coach
validates_associated :players, :coach ###MOST IMPORTANT LINE
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
В вашем контроллере
t = Team.new
@coach = t.build_coach(:column1=> "value1", :column2=> "value2" ) # This create new object with @coach.team_id= t.id
@players = t.players.build
t.save#This will be true it passes the validation for all i.e. Team, COach & Player also save all at once otherwise none of them will get saved.