查找存在属性的记录

时间:2013-07-19 09:28:48

标签: ruby-on-rails ruby

我的User模型的属性为usernameemailname

注册时需要

usernameemail,但不是name

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

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

我正在考虑以下几点:

User.where(name: present?)

5 个答案:

答案 0 :(得分:35)

数据库中的空值获取特殊值NULL。测试是否设置使用特殊比较器IS NULLIS 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

ActiveRecord条件

在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

如果你追加.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')