ActiveRecord belongs_to 关联 ID 并不总是设置
ActiveRecord belongs_to association id is not always set
我有这样的模型:
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 字段大部分时间都存在,但有时在数据库中不存在。我在属于关联的活动记录文档中看到未保存。这对我来说看起来像是一种竞争条件,但我想了解为什么会发生这种情况。
提前致谢!
始终通过关联创建关联对象。这意味着您应该执行以下操作:
t = Team.create!
m = t.members.create!
这在 Active Record Associations 的指南中有更详细的描述。
您询问为什么您提供的示例有时有效而其他示例无效。我无法复制您所看到的问题。它可能是您的实施或实践所特有的,但您的问题中没有共享。以下是我验证问题没有发生的方法。
首先,创建 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
没有出现异常,所以通过这种方式创建,您可以放心它会正常工作。
我有这样的模型:
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 字段大部分时间都存在,但有时在数据库中不存在。我在属于关联的活动记录文档中看到未保存。这对我来说看起来像是一种竞争条件,但我想了解为什么会发生这种情况。
提前致谢!
始终通过关联创建关联对象。这意味着您应该执行以下操作:
t = Team.create!
m = t.members.create!
这在 Active Record Associations 的指南中有更详细的描述。
您询问为什么您提供的示例有时有效而其他示例无效。我无法复制您所看到的问题。它可能是您的实施或实践所特有的,但您的问题中没有共享。以下是我验证问题没有发生的方法。
首先,创建 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
没有出现异常,所以通过这种方式创建,您可以放心它会正常工作。