64

导轨 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

4 回答 4

88

您可以使用以下

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

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

在 Rails 4 中,添加了以下语法以支持 not 子句

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

添加多个带有链接的子句...

Product.where.not(id: params[:id]).where.not(category_id: params[:cat_id])
于 2012-08-29T19:16:24.240 回答
34

没有任何内置方法可以做到这一点(从 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(...))。

于 2012-08-29T19:16:26.710 回答
24

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

Model.where.not(:id => params[:id])
于 2013-09-06T07:34:29.940 回答
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)

希望这个帮助

于 2012-08-30T17:08:08.790 回答