Rails:唯一性验证无法找到以前的记录

时间:2013-05-31 00:19:48

标签: ruby-on-rails ruby activerecord sqlite

我有一个bizzarre故障,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的唯一性,问题是在数据库端(我使用的是sqlite3)。我知道这是因为我决定自己查看数据库以查看使用此查询是否确实存在冲突:

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

对此问题的任何帮助都将不胜感激;我准备把头发撕掉了。

1 个答案:

答案 0 :(得分:0)

好的,我设法解决了这个问题。我认为这是一个sqlite3问题,因为一旦我将content_hash列的text类型更改为string列,所有内容都能正常运行。怪异。