保存记录由于与自身的唯一性冲突而失败?

时间:2014-05-26 14:14:29

标签: ruby-on-rails validation ruby-on-rails-4

我有一个程序接收两个模型,一个已经存在,另一个包含我想要合并到第一个模型中的新属性。

由于程序的其他部分对新模型持有相同的引用,我不能只对现有模型进行操作。因此我做了以下事情:

def merge(new_model, existing_model)
    new_model.attributes = existing_model.attributes.merge(new_model.attributes)
    new_model.id = existing_model.id
end

现在正在保存new_model,这给了我唯一性erorr(即使它在技术上是相同的模型)。我也尝试使用重载方法,但结果相同。

背景

上述方法在关联的before_add回调中运行。我希望能够在模型上调用更新(使用嵌套关联),而不必指定嵌套模型的ID。这个更新应该合并一些关联,这就是为什么我尝试做上面的整个合并。

1 个答案:

答案 0 :(得分:0)

您无法设置模型的id,然后保存期望设置ID的记录,因为id是数据库的主键。因此,您实际上正在创建一个全新的记录,因此,唯一性验证错误。因此,您需要考虑其他一些设计来实现您的需求。可能有助于知道您尝试执行的操作与deep_dup类似,只是ActiveRecord没有定义此方法(但 Hash 确实如此)。