ActiveRecord относится к идентификатору ассоциации не всегда - PullRequest
0 голосов
/ 31 октября 2018

У меня есть такие модели:

class Member
  belongs_to :team, class_name: 'Team'
end

class Team
  has_many :members, foreign_key: :team_id
end

В базе данных есть все необходимые столбцы.

Когда я делаю: t = Team.new m = Member.new

m.team = team
m.save!
#some other code
t.save!

Поле team_id присутствует в большинстве случаев, но иногда отсутствует в базе данных. Я видел в активной записи документации, которая принадлежит ассоциации не сохраняется. Для меня это похоже на состояние гонки, но я хочу понять, почему это может произойти.

Заранее спасибо!

1 Ответ

0 голосов
/ 31 октября 2018

Всегда создавайте связанные объекты через ассоциацию. Это означает, что вы должны сделать следующее:

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

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

...