Rails - 按计数器缓存(likes_count)排序,但仅限于今天创建的喜欢



目前,我正在订购带有计数器缓存的记录,以跟踪他们拥有的喜欢数量,例如:

Post.order("COALESCE(likes_count, 0) DESC").limit(10)

有没有办法在用于对项目进行排序的缓存等上合并时间限制?例如,仅包含过去 24 小时内创建的赞。

喜欢是这样处理的:

喜欢.rb

belongs_to :liker, class_name: "User"
belongs_to :liked, class_name: "Post", :counter_cache => :likes_count
validates :liker_id, presence: true
validates :liked_id, presence: true

用户.rb

has_many :likes, foreign_key: "liker_id", dependent: :destroy
has_many :liked_posts, through: :likes, source: :liked

后.rb

has_many :likes, foreign_key: "liked_id", dependent: :destroy
has_many :liker_users, through: :likes, source: :liker

非常感谢您的任何答案。非常感谢。

由于计数器缓存本身似乎没有功能来实现这一点,我最终绕道而行,但这本身实际上非常简单。它只是将计数器缓存排名的对象缩小到在 24 小时内获得新喜欢的对象。

application_helper.rb

 def trending_posts
    likes = Like.where("created_at >= ?", Time.now - 24.hours).select(:liked_id)
    trending = Post.where(id: likes)
    trending.order("COALESCE(likes_count, 0) DESC").limit(3)
 end

查看.html.eb

 <%= render trending_posts %>

如果有人对此有任何改进的想法,我相信很多人都非常感谢。我不打算将此标记为可接受的答案,以防有人想出最终的方法。

我最近做了类似的事情。我所做的是在帖子模型中添加一列:

t.string :state, :default => nil

然后我创建了一个名为"趋势"的耙子任务,该任务基本上在特定时间段内按喜欢对帖子进行排序,并将其 :state 设置为"趋势":

trending_posts = Post.trending.first(100)
trending_posts.each do |post|
   post.update_attributes(:state => “trending”)
end

这里的"趋势"是我在post.rb中定义的一种方法(虽然对于Postgres)

def self.trending
  joins("LEFT OUTER JOIN Likes ON likes.post_id = post.id 
                   AND likes.created_at >= (now() - interval '24 hour')")
                  .group("post.id").order("COUNT(likes.id) DESC”)
end

当您运行 rake 任务时,您必须首先清除旧的热门产品,这意味着将它们的状态设置为 nil。否则它会搞砸耙子运行。然后,您可以每天自动运行此 rake 任务,然后在控制器中仅引用具有趋势状态的帖子。

@trending_posts = Post.where(:state => “trending”)

通过这种方式,您还可以创建一个流行状态(上个月喜欢最多的帖子)或任何其他状态。您只需给它一个不同的名称并创建一个新的耙子任务。

最新更新