目前,我正在订购带有计数器缓存的记录,以跟踪他们拥有的喜欢数量,例如:
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”)
通过这种方式,您还可以创建一个流行状态(上个月喜欢最多的帖子)或任何其他状态。您只需给它一个不同的名称并创建一个新的耙子任务。