Fel*_*ger 20 ruby ruby-on-rails
我有一个User带有属性的模型username,email和name.
username并email在注册时是必需的,但不是name.
查找已填写的所有用户的查询name是什么(即它不是零)?
查询应该至少与Rails 3.2和4.0兼容.
我正在考虑以下几点:
User.where(name: present?)
Run Code Online (Sandbox Code Playgroud)
nat*_*vda 35
数据库中的空值获取特殊值NULL.测试是否设置使用特殊比较器IS NULL或IS 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)
在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,你可以看到它们如何转换为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)
| 归档时间: |
|
| 查看次数: |
23348 次 |
| 最近记录: |