Rails/Arel: select case sum along with model



我有一个名为Post(表posts)的模型,它与名为User(表users)的模型有关系,该模型被引用为"uploader"在Post模型中(posts表有一个名为uploader_id的列,它是表用户的id)。一个用户可以有多个帖子,其中一些可以被删除(通过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是不够的。

我已经试过很多次了,但不管我怎么做,我都弄不明白。它要么尝试插入"#<Arel::Nodes::Count:0x0000565…&quot;作为SQL字符串中的文字,或者返回nil数组。>

最让我沮丧的是,如果我只想要帖子总数和用户,这个方法反而有效:

::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)或者任何为"true"的值。

试试下面的命令:

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)

相关内容

  • 没有找到相关文章

最新更新