如何在以下情况下模拟NOT IN SQL条件

时间:2011-02-08 17:50:15

标签: ruby-on-rails

我正在使用Ruby on Rails 2.3.8,我希望得到尚未添加到@products数组的所有listed_products

例如,假设我有以下代码:

listed_products = ['1', '2', '3', '4', '5']

#Then, I would like to do something like SELECT * FROM products where id not in
#(listed_products), and save the result in @products

我知道上面的SQL语法不起作用,但我只是想让你们了解我想要实现的目标。

这样做是否有“轨道”?

提前致谢!

3 个答案:

答案 0 :(得分:11)

是的,您可以执行以下操作(Rails 2.3.x):

listed_products = [1,2,3,4,5]
Product.find(:all, :conditions => ["id NOT IN (?)", listed_products])

或者在Rails 3.0.x中:

listed_products = [1,2,3,4,5]
Product.where("id NOT IN (?)", listed_products)

答案 1 :(得分:1)

Pan的答案是正确的,但您也可以使用2.3.8中的范围,它允许您与该类的其他范围链接:

class Product
    ...
    named_scope :excluding_ids, lambda { |*ids|
      if ids.count==0 then
        {}
      else
        {:conditions => ["id NOT IN (?)",ids]}
      end
    }
    ...
end

然后,您可以与班级中的其他范围链接。假设您有一个名为:active的范围。然后你可以这样做:

Products.active.excluding_ids(*listed_products).find :all, ... more conditions ...

并且它将与范围的顺序无关:

Products.excluding_ids(*listed_products).active.find :all, ..

答案 2 :(得分:-1)

我能想到的最好的是:

SELECT * FROM products where id not = '1' and id not = '2' (etc...)

在我确定之后不是你的意思,但这可能是唯一的方法!