计算在最后一个 post ActiveRecord 之后出现了多少 post

Count how many posts came out after the last post ActiveRecord

我在 ActiveRecord 中有以下问题。

模型和示例字段

Post [ title:string content:string color:string ]

假设我的模型收到重复出现的 post,但有时特定的 post 带有“白色”颜色。

现在想象一下,大约 30 分钟前出现了一个颜色为“白色”的 post,而在那 30 分钟内出现了几个其他颜色的 post。

问题是我无法想象在最后一个 post 白色之后出现了多少 post!

def self.count_posts_last_white(last_post_id, last_white_id)
   self.where(id: last_white_id..last_result_id - 1).count
end

我不久前问过这个问题,但经过一番苦思冥想,我最终找到了解决方案

可能是这样的:

def self.count_post_by_color(color)
  where(created_at: Post.where(color: color).last.created_at..Time.current).count
end

虽然两个提议的解决方案都可以工作,但它们需要实例化一个 Post 对象,在我看来这是不必要的,我们可以像这样将其作为单个查询

class Post < ApplicationRecord 

  scope :posts_since, ->(color) {
         where(arel_table[:created_at].gt(
                  select(arel_table[:created_at].maximum).where(color: color).arel))}
end 

可调用为

Post.posts_since(:white) 

结果查询

SELECT 
  posts.* 
FROM 
  posts 
WHERE
  created_at > (SELECT MAX(posts.created_at) FROM posts WHERE posts.color = 'white'))

要“计数”,您只需添加 count,例如Post.posts_since(:white).count