并非总是设置ActiveRecord所属ID关联ID

时间:2018-10-30 22:00:19

标签: ruby-on-rails ruby activerecord sinatra sinatra-activerecord

我有这样的模型:

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 :(得分: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

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