如何通过关联的模型计数对ActiveRecord结果进行排序?

时间:2016-02-11 05:42:29

标签: ruby-on-rails ruby sorting

class Cafe < ActiveRecord::Base

  belongs_to :user

  has_many :posts, dependent: :destroy
  has_many :tags, dependent: :destroy
end

这是cafe.rb模型

class Post < ActiveRecord::Base
  belongs_to :cafe
  belongs_to :user
end

这是postq.rb。帖子就像回复一样。

我想创建新的cafe数组并按cafe.posts.count对其进行排序。 最后,我将展示前两家有很多回复的咖啡馆。

我尝试了一些排序代码,例如

@cafe_by_posts = Cafe.joins(:post).order('posts.size dsc')

但它没有用。错误说咖啡馆与邮政无关。 如何通过关联的模型计数对ruby数组进行排序?

我不擅长英语,我很感激你的答案!

3 个答案:

答案 0 :(得分:3)

关系名称为posts而非post,请注意:

has_many :posts, dependent: :destroy

排序应该通过SQL约束来完成。 MySQL中没有dsc排序顺序,它是desc。那么,你走了:

 @cafe_by_posts = Cafe.joins(:posts)
                      .group('posts.cafe_id')
                      .order('COUNT(posts.cafe_id) DESC')
                      .limit(2) # to retrieve only 2 topmost records

答案 1 :(得分:2)

mysql你可以直接使用

@cafe_by_posts = Cafe.joins(:posts).group("posts.cafe_id").order('count(posts.cafe_id) desc')

您可以使用limit

直接选择前2名
 @cafe_by_posts = Cafe.joins(:posts).group("posts.cafe_id").order('count(posts.cafe_id) desc').limit(2)

答案 2 :(得分:0)

您可以使用counter_cache

class Post < ActiveRecord::Base
   belongs_to :cafe, counter_cache: true
   belongs_to :user
end

然后添加迁移:

add_column :cafe, :posts_count, :integer, default: 0

然后你可以查询为

@cafe_by_posts = Cafe.order('posts_count DESC')