我有一个具有和User
属性username
的模型。email
name
username
并且email
在注册时是必需的,但不是name
。
查找所有已填写的用户的查询是什么name
(即它不是零)?
查询应该至少兼容 Rails 3.2 和 4.0。
我在想一些事情:
User.where(name: present?)
我有一个具有和User
属性username
的模型。email
name
username
并且email
在注册时是必需的,但不是name
。
查找所有已填写的用户的查询是什么name
(即它不是零)?
查询应该至少兼容 Rails 3.2 和 4.0。
我在想一些事情:
User.where(name: present?)
数据库中的空值获得特殊值NULL
。测试是否设置使用特殊比较器IS NULL
或IS NOT NULL
。
那么仍然存在填充空字符串的可能性,因此完整的测试将是
@users = User.where("name is NOT NULL and name != ''")
[为 rails 4+ 更新]
从 Rails 4 开始,我们可以写:
User.where.not(name: [nil, ""])
这将生成相同的查询。惊人的 :)
present?
本质上是not nil and not empty?
:
class Object
def present?
!blank?
end
def blank?
respond_to?(:empty?) ? !!empty? : !self
end
end
在 Rails 4 中,没有原始 sql 代码就不能完成条件。
# Both lines lead to the same result:
User.where.not(name: [nil, ""])
User.where.not(name: nil).where.not(name: "")
由于没有原始 sql 代码,因此您不必担心它们是否适用于每个数据库适配器。事实上,这对 mysql 和 postgres 都适用。
如果您附加 ,您可以看到它们如何转换为 sql 查询.to_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\" != '')"
NOT SQL 查询可以由 where.not 构建
@users = User.where.not(name: nil)
尝试这个:
User.where("name IS NOT NULL AND name != ?", "")
我根据@nathavanda 评论编辑了我的答案,我认为他的答案应该是公认的。