我有这样的模型:
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字段在大多数情况下都存在,但有时在数据库中不存在。我在活动记录文档中看到属于关联的文档未保存。对我来说,这看起来像是一个竞赛条件,但我想了解为什么会发生这种情况。
谢谢!
答案 0 :(得分:2)
始终通过关联创建关联的对象。这意味着您应该执行以下操作:
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
不会引发异常,因此通过这种方式创建,可以确保它可以正常工作。