rails 3嵌套条件

时间:2012-03-25 16:20:24

标签: 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.count
 => 5 

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

你可以看到所有的类型字段都是nil但是当我这样做时,where where where总是不返回

 User.find(4).friends.where("type != 'ContactGroup'")
 => [] 

 User.find(4).friends.where(["type != ?", "ContactGroup"])
 => [] 

我做错了什么,为什么它没有返回明显匹配的记录

3 个答案:

答案 0 :(得分:2)

我认为数据库中type列的值实际上是NULL

然后,您现在观察NULL值的一个有趣方面。将NULL与其他值进行比较的结果既不是TRUE也不是FALSE,而是UNKNOWN。因此,在您的数据库中,值与NULL的比较永远不会成立,反之亦然。这就是为什么你在上次查询中看不到任何结果的原因。

为了缓解这种情况,有一个特殊的比较运算符:IS NULLIS NOT NULL。你可以在这样的轨道上使用它:

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

答案 1 :(得分:1)

friends已经是一个数组,并将回复.select.

User.find(4).friends.select {|f| f.type != 'ContactGroup'}

# Or .reject
User.find(4).friends.reject {|f| f.type == 'ContactGroup'}

答案 2 :(得分:0)

由于Rails如何实现单表继承,因此不应使用列名typeThis article explains in more detail

它仍然适用于Rails 3.在Rails 3控制台中,我尝试执行您尝试的相同操作时出现此错误。

  

ActiveRecord :: SubclassNotFound:单表继承机制   找不到子类:'test'。提出此错误是因为   列'type'保留用于存储类的情况   遗产。如果您不打算将此列重命名,请重命名   用于存储继承类或覆盖   VideoFile.inheritance_column使用另一列   信息。