我有一个名为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…"作为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)