2

次のモデルが与えられます:

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を使用してこれを実行したいと思います。

ありがとう!!

4

2 に答える 2

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")
于 2012-06-07T23:59:22.763 に答える
0

だから私はそれを動かしました。xnmに感謝します。あなたは私を正しい方向に送りました。MAXを忘れてしまったなんて信じられません。:(

GROUPBYも修正する必要がありました...

作業バージョンは次のとおりです。

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
于 2012-06-12T01:24:40.150 に答える