2011-02-10 36 views
1

这有效,但有些事情告诉我我应该在SQL中执行此操作。
我真的很糟糕,所以请帮助我。如何通过has_many关系计数来优化此类排序

我想在我的当前月份或指定月份将我的user s按其数量gesture排序。

我有这样的User.rb

def self.mayor(month = nil, year = nil) 
    month = Date.today.month if !month 
    year = Date.today.year if !year 
    self.all.sort { |a, b| 
    b.gestures.done_in_month(month, year).count <=> 
    a.gestures.done_in_month(month, year).count }.first 
end 

而这gesture.rb

scope :done_in_month, lambda { |*args| 
    return nil if !args[0] 
    date = Date.new((args[1] || Date.today.year), args[0]) 
    where(:done_on => date.beginning_of_month..date.end_of_month) 
} 

任何帮助或指导,非常感谢!

回答

1

使用此

 
def self.mayors(month = Date.today.month, year = Date.today.year) 
    date = Date.new(year, month) 
    self.group("users.id"). 
    joins(:gestures). 
    select("users.*, COUNT(users.id) as gestures_count"). 
    order("gestures_count DESC"). 
    where(:gestures => {:done_on => date.beginning_of_month..date.end_of_month}) 
end 

def self.mayor(month = Date.today.month, year = Date.today.year) 
    self.mayors(month, year).first 
end 

像:

User.mayors(1,2011).map(&:gestures_count) 
#=> [20, 15, 15, 12, 3] 

mayor = User.mayor 
puts "Our mayor user is: " + mayor.name + ", with " + mayour.gestures_count + " gestures" 
+0

正是我想要的。谢谢。 – mikker 2011-02-10 15:56:14

相关问题