我有一个用户可以查看的模型列表,如果他们认为某个特定项目不合适,他们可能会标记它。我想排除其标记达到一定阈值的项目,但我不确定如何实现这一点,因为标记计数不是我模型的一部分。
我知道我可以使用以下内容来获取模型的标记数量:
Model.flaggings.count
但我该如何过滤呢?我尝试以我认为可能无效的方式添加范围:
def self.appropriate
return unless self.flaggings.count > 5
end
答案 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