我有一个拥有许多社区的国家/地区
# 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
订购,订购具有最多景点的社区。 p>
我稍微改变了@ 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个景点的社区都没有显示,我该如何解决?
答案 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宝石