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])的反义词

UPDATE

在导轨4中not操作员。

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

4 Solutions collect form web for “Rails的ActiveRecord查询不等于”

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

 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]) 

UPDATE

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

您可以使用以下内容

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

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

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

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

Rails 4已经搞清楚了。 所以,也许你可以更新你的rails应用程序

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

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 Like

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

希望这个帮助

  • 将Rails应用程序更改为生产
  • 如何计算ROR中特定字段中具有唯一值的logging数?
  • 它与RSpec中的块和指定块之间的区别
  • 在Ruby on Rails中,DateTime,Timestamp,Time和Date有什么区别?
  • 当我在Rails中运行rake db:seed时US-ASCII(参数错误)中的无效字节序列
  • 如何生成迁移以使引用具有多态性
  • 如何testing也定义为辅助方法的ApplicationController方法?
  • has_secure_password是否使用任何forms的salting?
  • 在rails中未定义的方法`devise_for'
  • 如何处理Ruby on Rails错误:“请安装postgresql适配器:`gem install activerecord-postgresql-adapter'”
  • Rails路由(root:to => ...)