导轨 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])
导轨 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])
您可以使用以下
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])
没有任何内置方法可以做到这一点(从 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(...)
)。
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
SELECT `products`.* FROM `products` WHERE (`products`.`id` != 1)
希望这个帮助