覆盖belongs_to关系中的对象

时间:2015-09-15 08:24:38

标签: ruby-on-rails ruby ruby-on-rails-4 override belongs-to

我有这样的模特:

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)。我想要的是创建新的真实性,而不是在nil字段中存储user_id的真实性。我目前正在手动销毁旧的,但我很好奇我是否可以说某种方式为我做这件事。但是,我不想使用after_create。对此有什么解决方案吗?

3 个答案:

答案 0 :(得分:1)

您看到两条记录,因为您要创建两次,而是执行此操作

u = User.first 
u.create_authenticity

您可以在创建Authenticity记录

之前执行检查
u.authenticity ||= Authenticity.create

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

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

答案 1 :(得分:0)

datetime(27)

答案 2 :(得分:0)

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