我有一个从数据库加载的ActiveRecord对象。
当我在此对象上调用valid?
时,由于未满足rails唯一约束,它返回false
,至少验证说明了这一点。
我检查了数据库模式,并且唯一字段也定义了索引,因此在数据库级别上也确保了唯一性。
这里发生了什么,这首先是如何实现的?
答案 0 :(得分:0)
您应该检查 @ object.errors.inspect 以检查发生了什么,然后相应地进行修复。
同样重要的是,何时检查对象的有效性,即在保存之前或保存之后。
更优雅的方式是使用@object.save!
Ruby应该告诉你在尝试保存对象时出了什么问题。
答案 1 :(得分:0)
如果您没有在数据库表中定义唯一索引,则会发生这种情况!
更详细一点:我认为数据库在列上有一个唯一的索引,但结果却是一个“常规”索引。
问题出现了,因为在应用程序的某个时刻,模型得到了保存而没有先验证它。这导致数据库中的非唯一条目。通过调用valid?
触发rails内部例程来检查唯一性(无论如何实现),它正确地返回false。
获得的经验教训:始终确保在数据库级别添加唯一索引。