在Rails 3.2中,我有3种型号:运动员、赛事和国家
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因此,我现在可以很容易地生成一组运动员,根据他们参加的项目数量来排序。
scope :ranked, :order => 'athletes.events_count DESC' 但是,如果我需要一批运动员,他们在某个特定的国家偶发,并根据他们在那个国家的赛事数量()来排序,那该怎么办呢?
#country
def show
@country.find(params[:id])
@athletes_leaderboard = Athlete.includes(:events).where(id: @country.events.uniq.map(&:athlete_id)).ranked
end给出了一个独特的运动员名单,他们曾经在那个国家发生过,但这是根据他们的总项目计数,而不是他们的国家项目计数排名。
如何在维护数据库性能的同时,按国家事件计数进行订购。
发布于 2013-05-26 04:03:40
该查询涉及到一个与子查询的位联接。
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):
- @athletes_leaderboard.each do |athlete_data|
= link_to athlete_data["name"], athlete_path(athlete_data["id"])您可能需要在内存存储区(如Memcache)中缓存主板,这样数据库就不会经常被击中。
https://stackoverflow.com/questions/16748876
复制相似问题