首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据关联计数的子样本订购记录?

如何根据关联计数的子样本订购记录?
EN

Stack Overflow用户
提问于 2013-05-25 11:02:48
回答 1查看 71关注 0票数 0

在Rails 3.2中,我有3种型号:运动员、赛事和国家

代码语言:javascript
复制
Class Athlete
  has_many :events
  has_many :countries, through: :event
end

Class Event
  belongs_to :athlete, counter_cache: true
  belongs_to :country, counter_cache: true
end

Class Country
  has_many :events
  has_many :Athletes, through: :event
end

因此,我现在可以很容易地生成一组运动员,根据他们参加的项目数量来排序。

代码语言:javascript
复制
scope :ranked, :order => 'athletes.events_count DESC' 

但是,如果我需要一批运动员,他们在某个特定的国家偶发,并根据他们在那个国家的赛事数量()来排序,那该怎么办呢?

代码语言:javascript
复制
#country
def show
  @country.find(params[:id])
  @athletes_leaderboard = Athlete.includes(:events).where(id: @country.events.uniq.map(&:athlete_id)).ranked
end

给出了一个独特的运动员名单,他们曾经在那个国家发生过,但这是根据他们的项目计数,而不是他们的国家项目计数排名。

如何在维护数据库性能的同时,按国家事件计数进行订购。

EN

回答 1

Stack Overflow用户

发布于 2013-05-26 04:03:40

该查询涉及到一个与子查询的位联接。

代码语言:javascript
复制
country_id = params[:id]
subsql = Event.select("events.athlete_id AS a_id, count(events.id) AS country_event_count").where("events.country_id = ?", country_id).group("a_id").to_sql
@athletes_leaderboard = Athlete.joins("JOIN (#{subsql}) AS participated_events ON participated_events.a_id = athletes.id").
  order("participated_events.country_event_count DESC")

@athletes_leaderboard的结果不再是ActiveRecord::Relation。它是数据库结果行。您将需要迭代结果并在视图中呈现它。例如(使用HAML):

代码语言:javascript
复制
- @athletes_leaderboard.each do |athlete_data|
  = link_to athlete_data["name"], athlete_path(athlete_data["id"])

您可能需要在内存存储区(如Memcache)中缓存主板,这样数据库就不会经常被击中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16748876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档