按协会的顺序排序

时间:2015-10-08 15:27:22

标签: sql ruby-on-rails ruby postgresql scope

我有一个拥有许多社区的国家/地区

# Country
has_many :communities

# Community
has_many :attractions

# Attraction
belongs_to :community

在我的Countries控制器中,我现在有这个:

def show
  @communities = @country.communities.all.order('name asc').paginate(page: params[:page], per_page: 30)
end

这给了我按名称排序的Communities

如何通过Community.attractions.count订购,订购具有最多景点的社区。

修改

我稍微改变了@ muhamad的回答

@communities = Community.joins(:country, :attractions).select("countries.*, communities.*, count(attractions.community_id) as attractions_count").group("communities.id, countries.id").order("attractions_count desc").where("countries.id = ?", @country.id).paginate(page: params[:page], per_page: 30)

问题是,每个拥有0个景点的社区都没有显示,我该如何解决?

2 个答案:

答案 0 :(得分:1)

尝试执行此查询

Community
  .select("communities.*, count(attractions.community_id) as attractions_count")
  .joins("LEFT JOIN `attractions` ON attractions.community_id = communities.id")
  .group("communities.id")
  .order("attractions_count desc")
  .where("communities.country_id = ?", @country.id)

对于此查询,您只能加入attractions表。加入countries表之前我错了,而你只在communities表中找到country_id的社区,然后在where条件下找到countries.id

我希望这对你有所帮助。

答案 1 :(得分:1)

我会使用rails counter_cache  http://guides.rubyonrails.org/association_basics.html

这意味着您将在Community表格中有一个attractions_count列,每次添加或删除景点时都会更新。

# Community
has_many :attractions

# Attraction
belongs_to :community, counter_cache: true
之后,您可以通过社区的attractions_count属性轻松订购社区。类似的东西:

@country.communities.order('attractions_count asc')

counter_cache的替代方法: counter_culture宝石