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。
<签入 user_id: 1, ski_resort_id: 1">
<签入 user_id: 1, ski_resort_id: 1">
<签入 user_id: 1, ski_resort_id: 1">

当用户 2 为不同的滑雪场签到 4 次时,计数为 4。
<CheckIn user_id: 2, ski_resort_id: 1">
<CheckIn user_id: 2, ski_resort_id: 2">
<CheckIn user_id: 2, ski_resort_id: 3">
<CheckIn user_id: 2, ski_resort_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

据我所知,由于counter_cache不支持唯一计数,因此存储您自己的计数将是最容易的。

使用 将 a 添加ski_resort_checkin_countusers整数字段default: 0, null: false

class User < ActiveRecord::Base
  has_many :check_ins
  has_many :ski_resorts, through: :check_ins

  def update_counts!
    update_column :ski_resort_checkin_count, ski_resorts.uniq.count
  end
end

class SkiResort < ActiveRecord::Base
  has_many :check_ins
  has_many :users, through: :check_ins
end

class CheckIn < ActiveRecord::Base
  belongs_to :user
  belongs_to :ski_resort

  after_create  :update_counts!
  after_destroy :update_counts!

  def update_counts!
    user.update_counts!
  end
end

然后你就可以做User.order(:ski_resort_checkin_count)

于 2013-04-23T08:32:41.453 回答
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 回答