Всегда создавайте связанные объекты через ассоциацию. Это означает, что вы должны сделать следующее:
t = Team.create!
m = t.members.create!
Более подробно это описано в руководстве для Ассоциации активных записей .
Вы спросили, почему приведенный вами пример иногда срабатывает, а другие нет. Я не могу воспроизвести проблемы, которые вы видите. Вероятно, это что-то конкретное для вашей реализации или практики, которые не разделяются по вашему вопросу Вот как я убедился, что проблема не возникает.
Сначала создайте приложение Rails, его ассоциации, его базу данных, а затем запустите консоль Rails:
rails new tester
cd tester
rails generate model Team
rails generate model Member team:belongs_to
sed -i '' 's/end/ has_many :members\'$'\nend/' app/models/team.rb
rake db:migrate
rails console
Теперь создайте тысячу команд со связанным участником, и, если поля не установлены должным образом, вызовите исключение:
1000.times do
t = Team.create!
m = t.members.create!
raise unless m.team_id && m.team_id == t.id
end
Или, альтернативно, используя .new
и .save!
:
1000.times do
t = Team.new
m = t.members.new
m.save!
raise unless m.team_id && m.team_id == t.id
end
Никаких исключений не возникает, поэтому, создавая таким образом, вы можете быть уверены, что он будет работать правильно.