查找存在属性的记录

Fel*_*ger 20 ruby ruby-on-rails

我有一个User带有属性的模型username,emailname.

usernameemail在注册时是必需的,但不是name.

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

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

我正在考虑以下几点:

User.where(name: present?)
Run Code Online (Sandbox Code Playgroud)

nat*_*vda 35

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

然后仍然存在填充空字符串的可能性,因此将进行完整的测试

@users = User.where("name is NOT NULL and name != ''")
Run Code Online (Sandbox Code Playgroud)

[更新轨道4+]

由于rails 4我们可以写:

User.where.not(name: [nil, ""])
Run Code Online (Sandbox Code Playgroud)

这将生成相同的查询.太棒了:)


fie*_*edl 18

当下?

present?基本上是not nil and not empty?:

class Object
  def present?
    !blank?
  end
  def blank?
    respond_to?(:empty?) ? !!empty? : !self
  end
end
Run Code Online (Sandbox Code Playgroud)

ActiveRecord条件

在Rails 4中,没有原始的sql代码就不能完成条件.

# Both lines lead to the same result:
User.where.not(name: [nil, ""])
User.where.not(name: nil).where.not(name: "")
Run Code Online (Sandbox Code Playgroud)

由于没有原始的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\" != '')"
Run Code Online (Sandbox Code Playgroud)

进一步阅读


gst*_*hle 11

不是SQL查询可以由where.not构建

@users = User.where.not(name: nil)
Run Code Online (Sandbox Code Playgroud)

  • 如果某些有空字符串,`@users = User.where.not(name: "")` 也很有用 (3认同)