ActiveRecord唯一性约束返回记录存在时不存在

时间:2015-03-24 20:19:10

标签: activerecord

我得到了这个输出:

Patient Exists (0.3ms)  SELECT 1 AS one FROM "patients" WHERE "patients"."chrono_id" = 5668276 LIMIT 1

我知道那个带有该号码的chrono_id的患者记录不存在,但无论如何我都去了控制台检查。

Patient.where(chrono_id: 5668276)
Patient Load (0.5ms)  SELECT "patients".* FROM "patients" WHERE "patients"."chrono_id" = 5668276
 => #<ActiveRecord::Relation []>

控制台同意我的意见。

我的模型验证看起来像

validates_uniqueness_of :chrono_id, :allow_blank => true, :allow_nil => true

如果我尝试在控制台中创建患者,我会收到相同的错误

Patient.create(chrono_id: 5668276, first_name: "a", last_name: "a", dob: "1988/12/11")
   (0.2ms)  BEGIN
  Patient Exists (0.4ms)  SELECT 1 AS one FROM "patients" WHERE "patients"."chrono_id" = 5668276 LIMIT 1

这是令人放心的,因为至少它意味着它不是一个环境问题。

我尝试重新创建结果返回的确切sql请求,这样我就可以看到结果并找出创建的时间/方式

a = ActiveRecord::Base.connection.select_all("SELECT 1 AS one FROM patients WHERE patients.chrono_id = 5668276 LIMIT 1")
   (0.4ms)  SELECT 1 AS one FROM patients WHERE patients.chrono_id = 5668276 LIMIT 1

 => #<ActiveRecord::Result:0x007fe0d343f650 @columns=["one"], @rows=[], @hash_rows=nil, @column_types={"one"=>#<ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::OID::Integer:0x007fe0cef8bcc0>}>

没有返回行值,所以我仍然感到困惑。有什么想法吗?

更新

我输了一个错字,正在输入其他必填字段之一为零。出于某种原因,Activerecord错误并没有告诉我这个字段存在问题,而是抛出了这个unique_record问题。

更新2 日志中的完整消息是

   (0.1ms)  BEGIN
  Patient Exists (0.9ms)  SELECT 1 AS one FROM "patients" WHERE "patients"."chrono_id" = 5669845 LIMIT 1
   (0.2ms)  ROLLBACK

1 个答案:

答案 0 :(得分:0)

我输了一个错字,正在输入其他必填字段之一为零。对我原帖的评论指出,我引用的'错误'实际上只是一个运行唯一性检查的日志,而不是它已经返回正数,尽管下一行是回滚。

如果遇到类似问题,我鼓励任何人阅读主帖上的评论。如果以海报作为答案进行总结,我会选择这个作为问题的答案。