Rails范围对NOT IN值没有任何作用

时间:2011-04-01 21:55:47

标签: ruby-on-rails-3 activerecord scope

我有一个Rails 3范围,它排除了一系列ID。

写入作用域的最佳方法是什么,以便在数组为空且仍可链接时它不执行任何操作?我目前有这个,它有效,但看起来有点不错:

scope :excluding_ids, 
         lambda {|ids| ids.empty? ? relation : where('id not in (?)', ids) }

如果我没有“ids.empty ??关系:”位,当ids为空时,生成的SQL是

... ID not in (NULL) ...

总是不会返回任何内容。如下所示:

Model.excluding_ids([]).where('id > 0')

不会返回任何结果。

4 个答案:

答案 0 :(得分:19)

如果ids数组为空,则不返回任何内容。

scope :excluding_ids, lambda { |ids|
  where(['id NOT IN (?)', ids]) if ids.any?
}

如果没有ids,则查询将在没有任何其他约束的情况下运行。

答案 1 :(得分:7)

在Rails 4中,您可以使用:

scope :excluding_ids, ->(ids) { where.not(id: ids) }

答案 2 :(得分:3)

道格拉斯的回答略有不同,使用ruby 1.9 stabby lambda语法,而where方法中没有括号。

scope :excluding_ids, ->(ids) {where("id NOT IN (?)", ids) if ids.any?}

答案 3 :(得分:0)

以下怎么样? (尽管如此,它仍会检查一个空数组,所以如果这是你试图避免的,那就没有太大改进了。)

scope :excluding_ids,
     lambda {|ids| (ids.empty? && relation) || where('id not in (?)', ids) }