我的User
模型的属性为username
,email
和name
。
username
和email
,但不是name
。
查找填写name
的所有用户的查询是什么(即不是零)?
查询应该至少与Rails 3.2和4.0兼容。
我正在考虑以下几点:
User.where(name: present?)
答案 0 :(得分:35)
数据库中的空值获取特殊值NULL
。测试是否设置使用特殊比较器IS NULL
或IS NOT NULL
。
然后仍然存在填充空字符串的可能性,因此完整的测试将是
@users = User.where("name is NOT NULL and name != ''")
[更新轨道4+]
由于rails 4我们可以写:
User.where.not(name: [nil, ""])
将生成相同的查询。太棒了:)
答案 1 :(得分:14)
present?
基本上是not nil and not empty?
:
class Object
def present?
!blank?
end
def blank?
respond_to?(:empty?) ? !!empty? : !self
end
end
在Rails 4中, not conditions 可以在没有原始sql代码的情况下完成。
# Both lines lead to the same result:
User.where.not(name: [nil, ""])
User.where.not(name: nil).where.not(name: "")
由于没有原始的sql代码,您不必担心它们是否适用于每个数据库适配器。事实上,这适用于mysql和postgres。
如果你追加.to_sql
,你可以看到它们如何转换为sql查询,例如在rails控制台中。
# rails console
User.where.not(name: [nil, ""]).to_sql
# => "SELECT \"users\".* FROM \"users\" WHERE (NOT ((\"users\".\"name\" = '' OR \"users\".\"name\" IS NULL)))"
User.where.not(name: nil).where.not(name: "").to_sql
# => "SELECT \"users\".* FROM \"users\" WHERE (\"users\".\"name\" IS NOT NULL) AND (\"users\".\"name\" != '')"
答案 2 :(得分:11)
不能通过where.not
构建SQL查询@users = User.where.not(name: nil)
答案 3 :(得分:2)
试试这个:
User.where("name IS NOT NULL AND name != ?", "")
我根据@nathavanda评论编辑了我的答案,我认为他的答案应该是公认的答案。
答案 4 :(得分:0)
Rails 3 sort after .where condition using NOT NULL
@users = User.where('name IS NOT NULL')