Rails对相关模型的属性进行排序

时间:2012-06-07 23:02:28

标签: sql ruby-on-rails ruby

鉴于以下模型:

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来执行此操作,而不是执行额外的步骤 在应用服务器上。

谢谢!

2 个答案:

答案 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