Ruby on rails rails 3,其中嵌套条件

Ruby on rails rails 3,其中嵌套条件,ruby-on-rails,ruby,ruby-on-rails-3,where,Ruby On Rails,Ruby,Ruby On Rails 3,Where,好的,我有这个 User.find(4).friends [#<Contact id: 67, type: nil, default_contact_group: false, primary_contact_id: nil, invitation_code: nil, flag_for_review: true, code_name: nil, reset_password_token: nil, ....... ....... User.find(4).friends.cou

好的,我有这个

User.find(4).friends

 [#<Contact id: 67, type: nil, default_contact_group: false, primary_contact_id: nil, invitation_code: nil, flag_for_review: true, code_name: nil, reset_password_token: nil,  
.......
.......

User.find(4).friends.count
 => 5 

User.find(4).friends.map(&:type)
 => [nil, nil, nil, nil, nil] 

我做错了什么?为什么它不返回这些记录,这些记录显然与朋友匹配,并且已经是一个数组,并且将响应


friends
已经是一个数组,将响应


我假设数据库中
type
列的值实际上是
NULL

然后您现在观察到
NULL
值的一个有趣方面。将
NULL
与另一个值进行比较的结果既不是
TRUE
也不是
FALSE
,其
未知
。因此,在数据库中,将值与
NULL
进行比较从来都不是真的,反之亦然。这就是为什么在上次查询中看不到任何结果

为了缓解这种情况,有一个特殊的比较运算符:
为NULL
不为NULL
。您可以从rails使用它,如下所示:

User.find(4).friends.where(["type != ? or type IS NOT NULL", "ContactGroup"])

我假设数据库中
type
列的值实际上是
NULL

然后您现在观察到
NULL
值的一个有趣方面。将
NULL
与另一个值进行比较的结果既不是
TRUE
也不是
FALSE
,其
未知
。因此,在数据库中,将值与
NULL
进行比较从来都不是真的,反之亦然。这就是为什么在上次查询中看不到任何结果

为了缓解这种情况,有一个特殊的比较运算符:
为NULL
不为NULL
。您可以从rails使用它,如下所示:

User.find(4).friends.where(["type != ? or type IS NOT NULL", "ContactGroup"])

您不应该使用列名
type
,因为Rails是如何实现单表继承的

它仍然适用于Rails 3。在Rails3控制台中,我在尝试执行您正在尝试的相同类型的操作时遇到此错误

ActiveRecord::SubclassNotFound:单表继承机制 未能找到子类:“test”。出现此错误是因为 “type”列保留用于存储类,以防 遗产如果您不打算将此列重命名,请将其重命名 用于存储继承类或覆盖 VideoFile.u列使用另一个列 信息


您不应该使用列名
type
,因为Rails是如何实现单表继承的

它仍然适用于Rails 3。在Rails3控制台中,我在尝试执行您正在尝试的相同类型的操作时遇到此错误

ActiveRecord::SubclassNotFound:单表继承机制 未能找到子类:“test”。出现此错误是因为 “type”列保留用于存储类,以防 遗产如果您不打算将此列重命名,请将其重命名 用于存储继承类或覆盖 VideoFile.u列使用另一个列 信息


现在想象一下,朋友名单是巨大的。当你可以在数据库中进行过滤时,你真的不想在Ruby中进行过滤……现在想象一下,朋友列表是巨大的。当你可以在数据库中进行过滤时,你真的不想在Ruby中进行过滤。。。
User.find(4).friends.where(["type != ? or type IS NOT NULL", "ContactGroup"])