首页 > 解决方案 > ActiveRecord belongs_to 关联 ID 并不总是设置

问题描述

我有这样的模型:

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 字段大部分时间都存在,但有时在数据库中不存在。我在活动记录中看到属于关联的文档没有保存。这对我来说似乎是一种竞争条件,但我想了解它为什么会发生。

提前致谢!

标签: ruby-on-railsrubyactiverecordsinatrasinatra-activerecord

解决方案


始终通过关联创建关联对象。这意味着您应该执行以下操作:

t = Team.create!
m = t.members.create!

这在Active Record 关联指南中有更详细的描述。

您问为什么您提供的示例有时有效,但有时无效。我无法复制您所看到的问题。这可能是您的问题中未共享的特定于您的实施或实践的东西。这是我验证问题没有发生的方法。

首先,创建 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

或者,使用.newand .save!

1000.times do
  t = Team.new
  m = t.members.new
  m.save!
  raise unless m.team_id && m.team_id == t.id
end

不会引发任何异常,因此通过以这种方式创建,您可以确信它会正常工作。


推荐阅读