ActiveRecord查询nil字段

时间:2015-04-08 21:25:23

标签: ruby-on-rails ruby activerecord

这是我的测试查询和结果:

>Pack.first.pages
  Pack Load (0.3ms)  SELECT  "packs".* FROM "packs"   ORDER BY "packs"."id" ASC LIMIT 1
  Page Load (0.1ms)  SELECT "pages".* FROM "pages"  WHERE "pages"."pack_id" = $1  [["pack_id", 1]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Page id: 53, created_at: "2015-02-27 21:59:12", updated_at: "2015-03-23 16:41:05", pack_id: 1, name: "test - pack12?", client_name: "", thumbnail: nil, printable_page: nil, preview: nil, vuforia_archive: "dinosaur.zip", unity_bundle: "girl.unity3d", vuforia_identifier: nil, vuforia_archive_updated_at: "2015-02-27 21:59:12", unity_bundle_updated_at: "2015-03-23 16:41:05">]>

我关注的领域是零,所以为什么这不起作用......

> Pack.first.pages.where('thumbnail=? OR printable_page=? OR preview=?',nil,nil,nil)
  Pack Load (0.3ms)  SELECT  "packs".* FROM "packs"   ORDER BY "packs"."id" ASC LIMIT 1
  Page Load (0.1ms)  SELECT "pages".* FROM "pages"  WHERE "pages"."pack_id" = $1 AND (thumbnail=NULL OR printable_page=NULL OR preview=NULL)  [["pack_id", 1]]
=> #<ActiveRecord::AssociationRelation []>

2 个答案:

答案 0 :(得分:2)

根据您的SQL版本,您需要格式化查询,如下所示:

Pack.first.pages.where("thumbnail is null or printable_page is null or preview is null")

field = null无法正常工作。

答案 1 :(得分:1)

数据库实现三值逻辑,其中null既不是true也不是false。 Null不能被声明等于,不等于,大于或小于任何其他值,包括null,因此与null的比较将始终为null,因此不为真。对于零度有一个单独的测试:&#34;缩略图为空&#34;。

作为旁注,请记住一个谓词,例如&#34; name =&#39; jim&#39;&#34;在RDBMS中是一个真实的陈述,它是针对行进行测试的,这些行包含或不包含在该陈述是否为真的情况下。

另一方面,这意味着&#34;年龄在(1,null)&#34;可能是真的是年龄等于1,但不会是真的是年龄的值为null。同样,&#34;年龄不在(1,null)&#34;年龄= 2时为假,因为&#34; 2 = null&#34;是假的。

活动记录通常非常善于处理它,因为它可以通过根据my_age是否为空来编写不同的谓词来响应诸如where(:age =&gt; my_age)之类的条件。它甚至可以通过编写一个谓词来正确处理my_age是一个[1,2,nil]的数组,例如&#34;其中(1,2)或age的年龄​​为null&#34;。

长话短说,使用:

Pack.first.pages.where('thumbnail is null OR printable_page is null OR preview is null')