覆盖 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
字段中存储带有 nil
s 的真实性。我目前正在手动销毁旧的,但我很好奇我是否可以说 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 创建新记录时,当然不会删除以前的对象。如果您需要删除关联的对象,您应该明确地进行。
我有这样的模型:
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
字段中存储带有 nil
s 的真实性。我目前正在手动销毁旧的,但我很好奇我是否可以说 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 创建新记录时,当然不会删除以前的对象。如果您需要删除关联的对象,您应该明确地进行。