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)