2013-04-23 41 views
0

我正在使用Rails 3.1.3和Ruby 1.9.2以及MySQL 5.1進行開發。
我想通過獨特的相關模型計數模型。 這是我的代碼。如何通過統計相關模型的唯一ID進行排序

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次在同一滑雪勝地檢查,計數爲一個。
<檢入user_id說明:1,ski_resort_id:1" >
<檢入user_id說明:1,ski_resort_id:1" >
<檢入user_id說明:1,ski_resort_id:1" >

當用戶2中4次檢查對於不同的滑雪場,計數爲4
<簽入USER_ID:2,ski_resort_id:1" >
<檢入user_id說明:2,ski_resort_id:2" >
<簽入user_id說明:2,ski_resort_id:3" >
<簽入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}'。
如何將此規則的訂單範圍添加到用戶模型?
此致敬禮。

+0

在添加範圍之前,請先檢查是否可以編寫在Rails控制檯中運行的函數。 – 2013-04-23 07:56:03

回答

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

+0

對不起,這沒有用,你似乎有一個誤解。 – DIGITALSQUAD 2013-04-23 10:44:44

+0

可能。我只是一個初學者。但是,我仍然不認爲你需要原生SQL。 – 2013-04-24 10:29:51

0

由於counter_cache不支持獨特算作據我所知,這將是最簡單的存儲自己的計數。

ski_resort_checkin_count添加到users作爲整數字段與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)

+0

感謝您的回答。 實際上,您的答案是在滑雪勝地登記入住總數時的工作,但我想添加一些條件以提取特定的季節,例如創建於2011年。 – DIGITALSQUAD 2013-04-23 09:56:33

相關問題