Ruby on rails 使_可标记:按总标记进行过滤

Ruby on rails 使_可标记:按总标记进行过滤,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个模型列表,用户可以查看,如果他们认为某个特定项目不合适,他们可以标记它。我想排除标记达到某个阈值的项目,但我不确定如何实现这一点,因为标记计数不是我的模型的一部分 我知道我可以使用以下方法来获取模型的标记计数: Model.flaggings.count 但我如何才能过滤这些呢?我尝试以我认为可能无效的方式添加范围: def self.appropriate return unless self.flaggings.count > 5 end 你也可以 1缓存标记计数,并在

我有一个模型列表,用户可以查看,如果他们认为某个特定项目不合适,他们可以标记它。我想排除标记达到某个阈值的项目,但我不确定如何实现这一点,因为标记计数不是我的模型的一部分

我知道我可以使用以下方法来获取模型的标记计数:

Model.flaggings.count
但我如何才能过滤这些呢?我尝试以我认为可能无效的方式添加范围:

def self.appropriate
  return unless self.flaggings.count > 5
end
你也可以

1缓存标记计数,并在模型中对其进行筛选。这是一个计数器缓存,您可以手动连接它,或者让rails为您保持笔直

2在计数上添加要筛选的范围。这个答案是相关的:。这种方法使得添加其他作用域变得更加困难

就个人而言,我喜欢这样做:

3将不适当模型项的所有ID缓存在另一个位置,例如Memcache或Redis,并使用此ID列表筛选范围内的结果

Model.appropriate.where(...)
其中“适当”作用域方法将从缓存中获取值

class Model < ActiveRecord::Base

  def self.appropriate
    where('models.id not in', Model.inappropriate_ids)
  end

  def self.inappropriate_ids
    Rails.cache.fetch('appropriate_model_ids'){
      # Get all ids of appropriate items in a single array.
      # Something like this
      Flagging.having('count(*) > 5').count(:group => :model_id).keys 
    }
  end

end

您可以使用having子句来实现这一点

class Model < ActiveRecord::Base

  has_many: :flaggings

  def self.appropriate_items 
    select("models.*, count(flaggings.id")).joins(:flaggings)group("models.id, flaggings.model_id").having("count(flaggings.id) < 5")  
  end

end