2013-04-23 2 views
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 раза, в то же горнолыжный курорт, количество один.
< CheckIn user_id: 1, ski_resort_id: 1" >
< CheckIn user_id: 1, ski_resort_id: 1" >
< CheckIn user_id: 1, ski_resort_id: 1" >

Когда пользователь 2 проверяется в 4 раза для различных лыжных курортов, граф четыре
< CheckIn идентификатор_пользователя:. 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}'.
Как добавить область действия для этого правила в пользовательскую модель?
С уважением.

+0

Перед тем, как добавить область проверки, можно ли написать функцию, которая запускается в консоли Rails. –

ответ

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

+0

Может быть. Я просто новичок. Но, я все еще не думаю, что вам нужен собственный SQL. –

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

Смежные вопросы