这是我的测试查询和结果:
>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 []>
答案 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')