Как мне оптимизировать этот вид по количеству отношений has_many - PullRequest
1 голос
/ 10 февраля 2011

Это работает, но что-то говорит мне, что я действительно должен делать это в SQL.
Что я действительно плохо умею, поэтому, пожалуйста, помогите мне.

Я хочу отсортировать мои 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 Ответ

1 голос
/ 10 февраля 2011

Используйте это

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...