SQLite,Ruby on rails。如何使用acts_as_votable gem获得最高投票对象?

时间:2015-12-06 20:12:21

标签: ruby-on-rails ruby sqlite

我试图显示过去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,需要计算它被投票的次数

1 个答案:

答案 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)