我试图显示过去7天内最好的3个食谱。 最好的是取决于它使用acts_as_votable gem的投票数量,但我还没有创建缓存。 当前user.rb,限制为过去7天
def featuredfeed
Recipe.where('created_at >= ?', Time.zone.now - 1.week)
end
recipe.rb
class Recipe < ActiveRecord::Base
belongs_to :user
acts_as_votable
....
default_scope -> { order(created_at: :desc) }
end
投票表已订购
id, votable_id, votable_type, voter_id, voter_type, vote_flag, vote_scope, vote_weight, created_at, updated_at
votable_id是食谱的ID,需要计算它被投票的次数
答案 0 :(得分:2)
我想说,缓存投票比下一个更清晰。这只是添加新迁移的问题。但取决于你......
获取最近食谱的ID(这部分你已经完成了):
recipes_ids = Recipe.where('created_at >= ?', Time.zone.now - 1.week)
过滤此食谱的投票:
Vote
.where(votable_id: recipes_ids)
按votable_id
分组:
.group(:votable_id)
找到那些有更多,至少一票的人:
.having('count(votable_id) > 1')
现在使用3个最受欢迎的食谱的ID:
most_voted_recipes_ids = Vote
.where(votable_id: recipes_ids)
.group(:votable_id)
.having('count(votable_id) > 1')
.limit(3).votable_ids # or limit(3).pluck(:votable_id)
最后,找到最受欢迎的食谱:
most_popular_recipes = Recipe.where(id: most_voted_recipes_ids)