0

我遇到了一个奇怪的故障,尽管该属性被完美保存并且验证被正确写入,但 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

对此问题的任何帮助将不胜感激;我正准备为这件事扯掉我的头发。

4

1 回答 1

0

好的,我设法解决了这个问题。我认为这是一个 sqlite3 问题,因为一旦我将类型content_hash从一text列更改为一列,一切都运行良好string。诡异的。

于 2013-05-31T19:48:33.340 回答