计算在最后一个 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
我在 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