好的,我有这个
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"])
=> []
我做错了什么,为什么它没有返回明显匹配的记录
答案 0 :(得分:2)
我认为数据库中type
列的值实际上是NULL
。
然后,您现在观察NULL
值的一个有趣方面。将NULL
与其他值进行比较的结果既不是TRUE
也不是FALSE
,而是UNKNOWN
。因此,在您的数据库中,值与NULL
的比较永远不会成立,反之亦然。这就是为什么你在上次查询中看不到任何结果的原因。
为了缓解这种情况,有一个特殊的比较运算符:IS NULL
和IS 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如何实现单表继承,因此不应使用列名type
。 This article explains in more detail
它仍然适用于Rails 3.在Rails 3控制台中,我尝试执行您尝试的相同操作时出现此错误。
ActiveRecord :: SubclassNotFound:单表继承机制 找不到子类:'test'。提出此错误是因为 列'type'保留用于存储类的情况 遗产。如果您不打算将此列重命名,请重命名 用于存储继承类或覆盖 VideoFile.inheritance_column使用另一列 信息。