Rails ActiveRecord 查询不等于

Posted

技术标签:

【中文标题】Rails ActiveRecord 查询不等于【英文标题】:Rails ActiveRecord Query for Not Equal 【发布时间】:2012-08-29 19:01:56 【问题描述】:

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

【问题讨论】:

【参考方案1】:

你可以使用下面的

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

【讨论】:

这可能在 params[:id] 为 nil 时正常工作。在 rails 3.2.X 我使用 Product.where('id != ?', params[:id].to_i) 在rails 3中,请指教,如果有多个id,那怎么办?前任。 Product.where('id != ?', 10000, 10001, 10004, 10035, 10088)【参考方案2】:

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

【讨论】:

PLUS ONE TO BE SURE....但也一定要测试空值。它们(在我看来)不相等,但结果查询不会返回字段为空的记录. where_not(:status => 'active') 例如.. 还要考虑... where_not_or Employee.where(:id=>1).where_not_or(:job_title=>'Awesome', :wages=>10000000).update_all(:job_title=> 'Awesome', :wages=>10000000, :updated_at => Time.now) 只会在事情发生变化时更新 @daveatflow,NULL 的 SQL 标准是从不返回,除非使用 IS NULL 或 IS NOT NULL 特别检查。所以我不同意调用 != 应该修改这种行为。添加or 方法将非常有益,但此时使用 Arel 或 Squeel 比重新发明***更容易。【参考方案3】:

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

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

【讨论】:

大声笑,升级 Rails 以改进他的 AR 调用的语法?我喜欢它,希望我能去我的管理层升级我们的一些旧平台! @MarkKadlec 创办自己的公司¯_(ツ)_/¯【参考方案4】:

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)

希望得到帮助

【讨论】:

如何使用这种语法查询多个属性?? .where(…) 也可以被链接,因此这扩展到了跨多个列的搜索。 Product.where(…).where(…)

以上是关于Rails ActiveRecord 查询不等于的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rails ActiveRecord 查询接口查找 a 的平均数量在两个模型之间有很多关联

Rails 5:ActiveRecord OR 查询

如何在 Rails 中链接原始 SQL 查询或如何从 Rails 中的原始 SQL 查询返回 ActiveRecord_Relation?

Rails:将复杂的 SQL 查询转换为 Arel 或 ActiveRecord

如何从 Rails 中的查询中排除 id 数组(使用 ActiveRecord)?

Rails ActiveRecord Arels:不支持的参数类型:字符串。改为构造一个 Arel 节点