Rails ActiveRecord查询不等于

时间:2012-08-29 19:01:57

标签: ruby-on-rails activerecord

Rails 3.2.1

有没有办法(没有squeel)使用ActiveRecord的哈希语法构建!=运算符?

Product.where(id: !params[:id])

这样的东西

生成SELECT products.* FROM products WHERE id != 5

寻找Product.where(id: params[:id])

的反面

更新

在rails 4中有一个not运算符。

Product.where.not(id: params[:id])

4 个答案:

答案 0 :(得分:78)

您可以使用以下

Product.where('id != ?', params[:id])

在参数化查询时,这将生成您要查找的内容。

使用Rails 4,添加了以下语法以支持非子句

Product.where.not(id: params[:id])

使用链接添加多个子句...

Product.where.not(id: params[:id]).where.not(category_id: params[:cat_id])

答案 1 :(得分:31)

没有任何内置方法可以做到这一点(从Rails 3.2.13开始)。但是,您可以轻松构建一种方法来帮助您:

ActiveRecord::Base.class_eval do
  def self.where_not(opts)
    params = []        
    sql = opts.map{|k, v| params << v; "#{quoted_table_name}.#{quote_column_name k} != ?"}.join(' AND ')
    where(sql, *params)
  end
end

然后你可以这样做:

Product.where_not(id: params[:id])

<强>更新

正如@DanMclain所回答 - 这已经在Rails 4中完成(使用where.not(...))。

答案 2 :(得分:23)

Rails 4已经解决了这个问题。所以也许你可以更新你的rails应用程序

Model.where.not(:id => params[:id])

答案 3 :(得分:13)

Arel 可能是您想要探索的那个它包含在Rails 3+中我想

此处如何使用 Arel

执行此操作
Product.where(Product.arel_table[:id].not_eq(params[:id]))

Product.where(Product.arel_table[:id].not_eq(params[:id])).to_sql 

将生成SQL,如下所示

SELECT `products`.* FROM `products`  WHERE (`products`.`id` != 1)

希望这个帮助