Rails/Arel: select 个案总和以及模型
Rails/Arel: select case sum along with model
我有一个名为 Post (table posts
) 的模型,它与一个名为 User (table users
) 的模型有关系,在 Post 模型中被称为“上传者”(帖子 table 有一个名为 uploader_id
的列,它是 table 用户的 id
。一个User可以有很多Post,其中一些可以删除(通过posts
中的is_deleted
布尔列标记)。
如何获得包含帖子总数和已删除帖子数的用户列表?
::Post
.select(
Arel.star.count.as("total"),
Arel::Nodes::Case.new.when(Post.arel_table[:is_deleted]).then(1).sum.as("deleted_count"),
:uploader
)
.joins(:uploader)
.group(:uploader)
.order(:total, :deleted_count)
.limit(20)
这不起作用。我需要将用户作为模型返回,uploader_id 是不够的。
我在这方面尝试了很多次,但无论我做什么我都无法弄清楚。它要么尝试将“#
令我非常沮丧的是,如果我只想要总帖子数和用户数,这反而有效:
::Post
.joins(:uploader)
.group(:uploader)
.order(Arel.sql("count(*) desc"))
.limit(20)
.count
我只是不知道如何添加条件案例总和,我是 rails 的新手,文档没有帮助。
“如何获取包含帖子总数和已删除帖子数的用户列表?” 看来您的方向是错误的。
最好从 User
开始,因为您希望返回 User
个对象。
此外,Post.arel_table[:is_deleted]
不是条件,这应该是 Post.arel_table[:is_deleted].eq(1)
或数据库中“为真”的任何条件。
改为尝试以下操作:
User.left_joins(:posts)
.select(
User.arel_table[Arel.star],
Post.arel_table[Arel.star].count.as('total_posts'),
Arel::Nodes::Case.new
.when(Post.arel_table[:is_deleted].eq(1)).then(1)
.else(0).sum.as('deleted_count'))
.group(:id)
.order(
Post.arel_table[Arel.star].count,
Arel::Nodes::Case.new
.when(Post.arel_table[:is_deleted].eq(1)).then(1)
.else(0).sum)
.limit(20)
我有一个名为 Post (table posts
) 的模型,它与一个名为 User (table users
) 的模型有关系,在 Post 模型中被称为“上传者”(帖子 table 有一个名为 uploader_id
的列,它是 table 用户的 id
。一个User可以有很多Post,其中一些可以删除(通过posts
中的is_deleted
布尔列标记)。
如何获得包含帖子总数和已删除帖子数的用户列表?
::Post
.select(
Arel.star.count.as("total"),
Arel::Nodes::Case.new.when(Post.arel_table[:is_deleted]).then(1).sum.as("deleted_count"),
:uploader
)
.joins(:uploader)
.group(:uploader)
.order(:total, :deleted_count)
.limit(20)
这不起作用。我需要将用户作为模型返回,uploader_id 是不够的。
我在这方面尝试了很多次,但无论我做什么我都无法弄清楚。它要么尝试将“# 令我非常沮丧的是,如果我只想要总帖子数和用户数,这反而有效: 我只是不知道如何添加条件案例总和,我是 rails 的新手,文档没有帮助。::Post
.joins(:uploader)
.group(:uploader)
.order(Arel.sql("count(*) desc"))
.limit(20)
.count
“如何获取包含帖子总数和已删除帖子数的用户列表?” 看来您的方向是错误的。
最好从 User
开始,因为您希望返回 User
个对象。
此外,Post.arel_table[:is_deleted]
不是条件,这应该是 Post.arel_table[:is_deleted].eq(1)
或数据库中“为真”的任何条件。
改为尝试以下操作:
User.left_joins(:posts)
.select(
User.arel_table[Arel.star],
Post.arel_table[Arel.star].count.as('total_posts'),
Arel::Nodes::Case.new
.when(Post.arel_table[:is_deleted].eq(1)).then(1)
.else(0).sum.as('deleted_count'))
.group(:id)
.order(
Post.arel_table[Arel.star].count,
Arel::Nodes::Case.new
.when(Post.arel_table[:is_deleted].eq(1)).then(1)
.else(0).sum)
.limit(20)