make_flaggable:按总标记过滤

时间:2013-09-09 23:46:33

标签: ruby-on-rails activerecord

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

我知道我可以使用以下内容来获取模型的标记数量:

Model.flaggings.count

但我该如何过滤呢?我尝试以我认为可能无效的方式添加范围:

def self.appropriate
  return unless self.flaggings.count > 5
end

2 个答案:

答案 0 :(得分:0)

你可以

1)缓存标记计数,并在模型中对其进行过滤。这是一个counter_cache,您可以手动将其挂起或让导轨保持笔直。

2)添加范围以过滤计数。这个答案是相关的:How can I find records by "count" of association using rails and mongoid?。这种方法使得添加其他范围变得更加困难。

Persoanlly,我喜欢这样做:

3)在另一个地方(例如Memcache或Redis)缓存“不适当”模型项的所有ID,并使用此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

答案 1 :(得分:0)

您可以使用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