Rails:按频率列出项目,包括频率

时间:2019-01-10 11:21:53

标签: mysql ruby-on-rails activerecord ruby-on-rails-5

以下内容每个类别将获得一个帖子:

Post.group(:category_id).order('count *')

然后,我可以列出代表职位的表格,通过列出每个结果来按类别列出一个职位:

CATEGORY | SAMPLE POST ID | SAMPLE POST TITLE
        1        |             123           | How to swim out loud
        2        |             246           | On Hamlet

但是,我想包括此类别中的帖子数,例如:

CATEGORY | AMOUNT | SAMPLE POST ID | SAMPLE POST TITLE
        1        |       5       |            123           | How to swim out loud
        2        |       2       |            246           | On Hamlet

我们如何显示金额,即“每组数量”?希望有一种方法可以从“发布”结果中提取它,作为适当的ActiveRecord查询的一部分。

请注意,这里没有“类别”表。 category_id只是一个独立的列。因此,不可能使用counter_cache。

2 个答案:

答案 0 :(得分:1)

您可以使用一些sql-magic(以下功能适用于mysql,尚未在postgres中进行测试,但也应该如此):

posts = Post.group(:category_id).order('count(*)').select('count(*) as category_cnt, posts.*')
category_count = posts.first.category_cnt

答案 1 :(得分:0)

我假设您的Post belongs_toCategory

话虽这么说,rails中有一个了不起的功能,叫做counter_cache。查看文档here

class Post < ApplicationRecord
  belongs_to :category, dependent: :destroy, counter_cache: true
end

class Category < ApplicationRecord
  has_many :posts
  # category should have a column called posts_count
end

现在,无论何时创建帖子,类别的posts_count都会增加;当您删除它时,它会减少。

关于您的列表,您可以执行以下操作:

Category.order(posts_count: :desc)和获取category.posts.first