Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-按计数器缓存排序(likes\u count),但仅限于今天创建的likes_Ruby On Rails_Ruby_Activerecord_Ruby On Rails 4_Counter Cache - Fatal编程技术网

Ruby on rails Rails-按计数器缓存排序(likes\u count),但仅限于今天创建的likes

Ruby on rails Rails-按计数器缓存排序(likes\u count),但仅限于今天创建的likes,ruby-on-rails,ruby,activerecord,ruby-on-rails-4,counter-cache,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 4,Counter Cache,目前,我正在使用计数器缓存订购记录,计数器缓存可跟踪记录的喜欢数量,例如: Post.order("COALESCE(likes_count, 0) DESC").limit(10) 有没有一种方法可以对用于对项目进行排序的缓存之类的缓存设置时间限制?例如,仅包括在过去24小时内创建的喜欢 类的处理方式如下: like.rb belongs_to :liker, class_name: "User" belongs_to :liked, class_name: "Post", :counter

目前,我正在使用计数器缓存订购记录,计数器缓存可跟踪记录的喜欢数量,例如:

Post.order("COALESCE(likes_count, 0) DESC").limit(10)
有没有一种方法可以对用于对项目进行排序的缓存之类的缓存设置时间限制?例如,仅包括在过去24小时内创建的喜欢

类的处理方式如下:

like.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
has_many :likes, foreign_key: "liker_id", dependent: :destroy
has_many :liked_posts, through: :likes, source: :liked
has_many :likes, foreign_key: "liked_id", dependent: :destroy
has_many :liker_users, through: :likes, source: :liker
 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
 <%= render trending_posts %>
user.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
has_many :likes, foreign_key: "liker_id", dependent: :destroy
has_many :liked_posts, through: :likes, source: :liked
has_many :likes, foreign_key: "liked_id", dependent: :destroy
has_many :liker_users, through: :likes, source: :liker
 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
 <%= render trending_posts %>
post.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
has_many :likes, foreign_key: "liker_id", dependent: :destroy
has_many :liked_posts, through: :likes, source: :liked
has_many :likes, foreign_key: "liked_id", dependent: :destroy
has_many :liker_users, through: :likes, source: :liker
 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
 <%= render trending_posts %>

非常感谢你的回答。非常感谢。

由于计数器缓存本身似乎没有实现这一点的功能,我最后做了一些迂回,但实际上这本身非常简单。它只是将使用计数器缓存进行排名的对象缩小到24小时内获得新喜欢的对象

应用程序\u helper.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
has_many :likes, foreign_key: "liker_id", dependent: :destroy
has_many :liked_posts, through: :likes, source: :liked
has_many :likes, foreign_key: "liked_id", dependent: :destroy
has_many :liker_users, through: :likes, source: :liker
 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
 <%= render trending_posts %>
view.html.eb

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
has_many :likes, foreign_key: "liker_id", dependent: :destroy
has_many :liked_posts, through: :likes, source: :liked
has_many :likes, foreign_key: "liked_id", dependent: :destroy
has_many :liker_users, through: :likes, source: :liker
 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
 <%= render trending_posts %>


如果有人对此有任何改进意见,我相信很多人都会非常感激。我不打算把这当作一个公认的答案,以防有人想出最终的解决办法。

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

t.string :state, :default => nil
然后我创建了一个名为“Trending”的rake任务,它基本上是在特定时间段内按喜好排序帖子,并将它们的:状态设置为“Trending”:

trending_posts = Post.trending.first(100)
trending_posts.each do |post|
   post.update_attributes(:state => “trending”)
end
这里的“趋势分析”是我在post.rb中定义的一种方法(尽管是针对Postgres)

运行rake任务时,必须首先清除旧的趋势产品,这意味着将其状态设置为零。否则,它将破坏耙运行。然后,您可以每天自动运行这个rake任务,然后在控制器中只引用具有趋势状态的帖子

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

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

不,您必须自己实现这样的功能,所以这仍然是按喜欢的总数排序的,但只有在过去24小时内至少有一个喜欢的帖子才会在您排序的帖子池中,对吗?