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 中链接原始 SQL 查询或如何从 Rails 中的原始 SQL 查询返回 ActiveRecord_Relation?
Rails:将复杂的 SQL 查询转换为 Arel 或 ActiveRecord