如何创建一个在Rails中不返回任何记录的where子句?

时间:2015-10-05 21:23:36

标签: ruby-on-rails ruby-on-rails-4 activerecord

有没有一种方法可以生成一个永远不会返回任何结果的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

2 个答案:

答案 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的角度做一些绝对疯狂的事情。