覆盖 belongs_to 关系中的对象

Overriding object in belongs_to relation

我有这样的模型:

class User
  belongs_to :authenticity
end

class Authenticity
  has_one :user
end

现在我为用户创建真实性:

u = User.first; u.authenticity = Authenticity.create

现在我分配新的真实性:

u.authenticity = Authenticity.create

现在我的数据库中有两个真实性:

irb(main):035:0> Authenticity.all
  Authenticity Load (0.3ms)  SELECT "authenticities".* FROM "authenticities"
=> #<ActiveRecord::Relation [
     #<Authenticity id: 22, token: nil, created_at: "2015-09-15 08:18:09", updated_at: "2015-09-15 08:18:46", user_id: nil>, 
     #<Authenticity id: 23, token: nil, created_at: "2015-09-15 08:18:45", updated_at: "2015-09-15 08:18:46", user_id: "1">
   ]>

一个属于用户,一个没有任何用户(user_id: nil)。我想要的是创建新的真实性并且不在 user_id 字段中存储带有 nils 的真实性。我目前正在手动销毁旧的,但我很好奇我是否可以说 rails 为我做这件事。但是我不想使用 after_create 。有解决办法吗?

class User
  has_one :authenticity
end

class Authenticity
  belongs_to :user
end

u = User.first
u.authenticate = Authenticate.create

您看到了两条记录,因为您创建了两次记录,请改为这样做

u = User.first 
u.create_authenticity

您可以在创建 Authenticity 记录之前强制执行检查

u.authenticity ||= Authenticity.create

如果您想用新记录删除旧 Authenticity 记录,请执行此操作

if u.authenticity
  u.authenticity.destroy
  u.authenticity = Authenticity.create
end

您正在创建 Authenticity 对象两次。这就是为什么你的数据库中有两条记录。您还有 belongs_to,它指定与 Authenticity class 的一对一关联。当您为关联 Rails 创建新记录时,当然不会删除以前的对象。如果您需要删除关联的对象,您应该明确地进行。