0

私は Rails 3.1.3 と Ruby 1.9.2 と MySQL 5.1 で開発しています。
ユニークな関連モデルの数でモデルを注文したいと思います。これが私のコードです。

class User < ActiveRecord::Base
  has_many :check_ins
  .
  .
end

class CheckIn < ActiveRecord::Base
   belongs_to :user, :counter_cache => true
   belongs_to :ski_resort, :counter_cache => true

   .
   .
end

class SkiResort < ActiveRecord::Base
   has_many :check_ins
   .
   .
end

そして、チェックインしたスキー場の数でユーザーモデルを並べたいと思います。

ユーザー 1 が同じスキー場に 3 回チェックインした場合、カウントは 1 です。
<チェックイン ユーザー ID: 1, スキー リゾート ID: 1">
<チェック イン ユーザー ID: 1, スキー リゾート ID: 1">
<チェック イン ユーザー ID: 1, スキー リゾート ID: 1">

ユーザー 2 が異なるスキー場に 4 回チェックインした場合、カウントは 4 になります。
<チェックイン ユーザー ID: 2, スキー リゾート ID: 1">
<チェック イン ユーザー ID: 2, スキー リゾート ID: 2">
<チェック イン ユーザー ID: 2, スキー リゾート ID: 3">
<チェック イン ユーザー ID: 2, スキー リゾート ID: 4">

以下に書きましたが、チェックイン回数順です。

  class User < ActiveRecord::Base
    scope :checked_in_ski_resorts_count_ranking, lambda{
      {
        :joins => {:check_ins => :ski_resort},
        :group => 'users.id',
        :order => 'COUNT(ski_resorts.id) DESC'
      }    
    }
    # => {1 => 3, 2 => 4}
  end

私が望む結果は '{2 => 4, 1 => 1}' です。
このルールによる注文のスコープをユーザー モデルに追加するにはどうすればよいですか?
よろしく。

4

2 に答える 2

0

これを試して:

users = {}
User.all.each do |u|
    users[u] = u.check_ins.uniq.count
end
sorted_users = users.sort_by {|name, check_ins| check_ins}
sorted_users.flatten(1)
(1..sorted_users.count).step(2) do |n|
    sorted_users.delete(n-1)
end

SQL を書くのはやめましょう。

注: 動作しない可能性があります:P

于 2013-04-23T08:14:30.617 に答える