【发布时间】:2013-01-22 14:39:24
【问题描述】:
我有一个从数据库加载的 ActiveRecord 对象。
当我在此对象上调用 valid? 时,由于未满足 rails 唯一约束,它返回 false,至少验证是这样说的。
我检查了数据库架构,唯一字段也定义了一个索引,因此在数据库级别上也确保了唯一性。
这里发生了什么?这怎么可能?
【问题讨论】:
标签: ruby-on-rails rails-activerecord
我有一个从数据库加载的 ActiveRecord 对象。
当我在此对象上调用 valid? 时,由于未满足 rails 唯一约束,它返回 false,至少验证是这样说的。
我检查了数据库架构,唯一字段也定义了一个索引,因此在数据库级别上也确保了唯一性。
这里发生了什么?这怎么可能?
【问题讨论】:
标签: ruby-on-rails rails-activerecord
您应该检查 @object.errors.inspect 以检查正在发生的事情,然后进行相应的修复。
同样重要的是,您何时检查对象的有效性,即在保存之前或之后。
更优雅的方式是使用@object.save!
Ruby 应该会告诉您在尝试保存对象时出了什么问题。
【讨论】:
如果您没有在数据库表上定义唯一索引,就会发生这种情况!
更详细一点:我认为数据库在列上有一个唯一索引,但结果证明这是一个“常规”索引。
问题出现了,因为在应用程序的某个时刻,模型在没有先验证的情况下被保存了。这导致数据库中的非唯一条目。通过调用valid? 触发rails 内部例程检查唯一性(无论如何实现),它正确返回false。
经验教训:始终确保在数据库级别添加唯一索引。
【讨论】: