有没有一种方法可以生成一个永远不会返回任何结果的where子句?
用例此搜索方法会生成where子句。但是,如果params无效,那么仍然应该返回where子句。但是where子句不应该返回任何记录。
class Foo < ActiveRecord::Base
def search params
if invalid?(params)
return where(...)
end
where(name: params[:name])
end
一个想法是使用where(id:nil)
,但这并不能明确表达意图。
Rails 4.1.7
答案 0 :(得分:6)
您正在寻找none
方法。
答案 1 :(得分:1)
您可以指定一个空数组,表示“一组空的所需值”:
Model.where(id: [])
这种情况转化为总是错误的东西:
SELECT "models".* FROM "models" WHERE 1=0
然而,还有一种更好的方法,Model.none
。它更好,因为它根本不与数据库交互(在大多数情况下)。因为如果没有条目被提取,为什么会这样呢?这个假设就是让这个范围的#to_sql
返回一个空字符串,这意味着不会触发任何查询。
Model.none.to_sql
# => ""
尽管如此,它仍可用作子查询!但是,输出有点令人惊讶(非空!):
Model.from(Model.none, :models)
SELECT "models".* FROM (SELECT "models".* FROM "models" WHERE (1=0)) things
是的,1=0
。
所以,使用#none
除非你从ActiveRecord的角度做一些绝对疯狂的事情。