1

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

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

post.rb

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

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

4

2 回答 2

2

由于计数器缓存本身似乎没有功能可以完成此操作,因此我最终绕道而行,但这本身实际上非常简单。它只是将使用计数器缓存排名的对象缩小到在 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 %>

如果有人对此有任何改进的想法,我敢肯定,很多人都会非常感激。我不会将此标记为可接受的答案,以防有人想出最终的方法来做到这一点。

于 2014-01-14T09:48:30.763 回答
0

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

t.string :state, :default => nil

然后我创建了一个名为“Trending”的 rake 任务,它基本上按特定时间段内的点赞排序帖子,并将它们的 :state 设置为“trending”:

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 运行。然后,您可以每天自动运行此 rake 任务,然后在您的控制器中仅引用具有趋势状态的帖子。

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

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

于 2014-04-03T11:13:39.867 回答