鉴于以下模型:
team.rb
class Team < ActiveRecord::Base
has_many :events, :dependent => :destroy
has_many :challenges, :through => :events
validates :name, :presence => true, :uniqueness => true
end
challenge.rb
class Challenge < ActiveRecord::Base
has_many :events, :dependent => :destroy
has_many :teams, :through => :events
validates :name, :presence => true, :uniqueness => true
validates :flag, :presence => true, :uniqueness => true
end
event.rb
class Event < ActiveRecord::Base
belongs_to :team
belongs_to :challenge
validates :team, :presence => true
validates :challenge, :presence => true
end
我想展示排名最高的球队。 排名最高的团队完成的挑战最多(事件)。 如果在X事件中存在平局,则完成第X事件的团队 首先排名最高。
因此,我可以根据事件的数量轻松对团队进行排序,然后显示它们。
像这样:
def index
@teams = Team.includes(:events).
select("*, COUNT(events.id)").
group("teams.id, events.id").
order("COUNT(events.id) DESC")
end
但是我不知道如何处理有平局的情况。 有人知道用SQL做这个的好方法吗?
我宁愿使用SQL来执行此操作,而不是执行额外的步骤 在应用服务器上。
谢谢!
答案 0 :(得分:1)
你可以试试这个:
@teams = Team.includes(:events).
select("*, COUNT(events.id) AS event_count, MAX(events.created_at) AS last_event_created_at").
group("teams.id, events.id").
order("event_count DESC, last_event_created_at ASC")
答案 1 :(得分:0)
所以我开始工作了。 谢谢xnm。你派我去了正确的方向。不敢相信我忘记了MAX。 :(
我还必须修复我的GROUP BY ...
以下是工作版本:
class Team < ActiveRecord::Base
...
def self.ranked
all(:select => "teams.*, COUNT(events.id) AS challenges_completed, MAX(events.created_at) AS last_event",
:joins => "LEFT OUTER JOIN events ON events.team_id = teams.id",
:group => "teams.id, events.team_id",
:order => "challenges_completed DESC, last_event ASC")
end
end