20

我有一个具有和User属性username的模型。emailname

username并且email在注册时是必需的,但不是name

查找所有已填写的用户的查询是什么name(即它不是零)?

查询应该至少兼容 Rails 3.2 和 4.0。

我在想一些事情:

User.where(name: present?)
4

5 回答 5

38

数据库中的空值获得特殊值NULL。测试是否设置使用特殊比较器IS NULLIS NOT NULL

那么仍然存在填充空字符串的可能性,因此完整的测试将是

@users = User.where("name is NOT NULL and name != ''")

[为 rails 4+ 更新]

从 Rails 4 开始,我们可以写:

User.where.not(name: [nil, ""])

这将生成相同的查询。惊人的 :)

于 2013-07-19T09:40:42.167 回答
20

当下?

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 都适用。

to_sql

如果您附加 ,您可以看到它们如何转换为 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\" != '')"

延伸阅读

于 2015-07-29T11:57:39.870 回答
11

NOT SQL 查询可以由 where.not 构建

@users = User.where.not(name: nil)
于 2015-01-13T21:13:24.410 回答
2

尝试这个:

User.where("name IS NOT NULL AND name != ?", "")

我根据@nathavanda 评论编辑了我的答案,我认为他的答案应该是公认的。

于 2013-07-19T09:30:32.117 回答
0

你可以简单地这样做:

User.where.not(name: '')

由于 的性质not,它不会包含 where nameisnil和空字符串的记录。有关和的更多详细信息,请参阅本文notnil

于 2021-11-19T11:19:26.733 回答