我遇到了一个奇怪的故障,尽管该属性被完美保存并且验证被正确写入,但 Rails 并未验证模型上属性的唯一性。
我添加了一个验证,以确保我的一个 Rails 模型上的值的唯一性Spark
,使用以下代码:
validates :content_hash, :presence => true, :uniqueness => true
是在使用回调调用的content_hash
方法中从模型的其他属性创建的属性。before_validation
使用 Rails 控制台,我已经确认这个哈希实际上是在验证之前创建的,所以这不是问题。
当我在 Rails 控制台中调用spark.valid?
我知道其上存在冲突的火花时content_hash
,控制台告诉我它已运行此查询:
Spark Exists (0.2ms) SELECT 1 AS one FROM "sparks" WHERE "sparks"."content_hash" = '443524b1c8e14d627a3fadfbdca50118c6dd7a7f' LIMIT 1
并且该方法返回该对象是有效的。验证器似乎工作得很好,并且正在运行正确的查询来检查content_hash
. 我知道这一点是因为我决定自己检查数据库以查看是否使用此查询确实存在冲突:
SELECT "sparks".* FROM "sparks" WHERE "sparks"."content_hash" = '443524b1c8e14d627a3fadfbdca50118c6dd7a7f'
奇怪的是,这个查询没有从数据库中返回任何内容,尽管我可以亲眼看到其他记录content_hash
存在于表中。
出于某种原因,这是一个只存在于表content_hash
属性的问题sparks
,因为当我对表的其他属性运行类似查询时,输出是正确的。
该content_hash
列与按预期工作的其他列没有什么不同,如我schema.rb
文件的相关部分所示:
create_table "sparks", :force => true do |t|
t.string "spark_type"
t.string "content_type"
t.text "content"
t.text "content_hash"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
对此问题的任何帮助将不胜感激;我正准备为这件事扯掉我的头发。