Сохранение активной записи, в том, какой порядок связанные объекты сохраняется?

В направляющих, при сохранении объекта 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 сбои в плеере.

Кто-то может объяснить мне, почему объекты сохраняются в этом порядке? Это кажется не логичным мне.

8
задан Shuo 21 April 2010 в 04:20
поделиться

1 ответ

Вы должны использовать "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.
0
ответ дан 6 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: