ruby-on-rails - ActiveRecord:如何进行 'OR' 合并?

标签 ruby-on-rails ruby activerecord

我试图在模型中解耦 ActiveRecord 查询,以便它们可以在不同情况下重复使用。为简单起见,假设我有一个名为 Product 的模型:

class Product < ActiveRecord::Base
  def self.over_stocked
    where('stock_count >= ?', 20)
  end

  def self.expensive
    where('price >= ?', 100.0)
  end
end

如果我想创建一种新方法来查找库存过多且价格昂贵的产品,我可以合并这两个查询:

...
def self.costly_stock
  # SQL => '... WHERE stock_count >= 20 AND price >= 100.0'
  over_stocked.merge(expensive)
end

但是,我如何使用这两种方法为价格昂贵或库存过多的产品创建新查询? 例如:

...
def expensive_or_over_stocked
  # SQL => '... WHERE stock_count >= 20 OR price >= 100.0'
  ...
end

基本上我正在寻找类似 merge 的东西,它使用 OR 而不是 AND。理想情况下,该解决方案将返回一个 ActiveRecord 关系而不是一个数组。显然,我可以用 where('stock_count >= ? OR price >= ?', 20, 100.0) 重写查询,但这不会很枯燥

最佳答案

我想出了以下解决方案。人们可以争论它有多干。

class Product < ActiveRecord::Base
  scope :over_stocked, -> { where.not(stock_count: [0..19]) }
  scope :expensive, -> { where.not(price: [0..99]) }
  scope :costly_stock, -> { expensive.over_stocked }
  scope :neither_expensive_nor_over_stocked, -> { where(stock_count: [0..19]).where(price: [0..99]) }

  def self.expensive_or_over_stocked
    Product.where.not(id: Product.neither_expensive_nor_over_stocked.pluck(:id))
  end
end

关于ruby-on-rails - ActiveRecord:如何进行 'OR' 合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23531757/

相关文章:

ruby-on-rails - 如何以不同方式对字符串列进行排序

ruby-on-rails - 获取 Rails 错误 "Cannot allocate memory"

ruby-on-rails - my_object.save(false) 并没有真正跳过我的 Active Record 验证

mysql - 无法从 Rails 更新 RDS 数据库

ruby-on-rails - 带有 MailCatcher 和 Devise gem 的 Rails 4

ruby-on-rails - Rails Controller 在浏览器中呈现 JSON

ruby-on-rails - 我怎样才能让我的网站这么快?

ruby-on-rails - Bundler 不会安装 libxml-ruby (2.3.3) Ubuntu

mysql - Ruby on Rails has_one 模型不提供 ID 列

ruby - Rails 4.1 ActiveRecord::relation 不再像数组