2011-03-21 63 views
1

我需要一些幫助來優化以下方法。查詢成本太高,因爲我的數據庫規模已經擴大到3K用戶和100K鍛鍊。不幸的是,我的SQL技能很簡單。減少查詢 - 關聯條件?

該方法返回相同性別的人的其他鍛鍊的特定鍛鍊的等級以及該性別的鍛鍊總數。還有其他適用條件,而我已刪除,以簡化這個樣本的鍛鍊:

Class Person 
    has_many :workouts 
    named_scope :men, :conditions => {:male => true} 
end 

Class Workout 
    belongs_to :person 
    named_scope :by, lambda {|person_id| {:conditions => {:person_id => person_id}}} 

    def rank_by_gender 
    people = Person.men.collect{|p| p.id} 
    { :place => 
     Workout.by(people).count(:conditions => ["time < ?", self.time]) + 1 
     :entries => 
     Workout.by(people).count() } 
    end 
end 
  • Person.men現在返回幾千條記錄。有沒有辦法將該查詢與計數查詢結合起來,可能是通過在人名錶上使用:male屬性進行聯接?

  • 有沒有辦法將Person關聯條件放入傳遞給count方法的條件中?

  • 除此之外,有沒有人看到其他方法來減少數據庫查詢的大小和時間在這種方法?

回答

1

這應該爲你工作:

{ 
    :place => Workout.joins(:person).where(["`workouts`.time < ? AND `people`.male = ?", self.time, true]).size, 
    :entries => Workout.joins(:person).where(:people => {:male => true}).size 
    } 
+0

感謝。忘記提及我的應用程序仍然堅持使用Rails 2.2,但很容易將語法更改爲Workout.all(:joins =>:person,:conditions => [...]) – 2011-03-21 02:48:16

+0

因爲我需要的只是計數,這是我完成的:Workout.count(:joins =>:person,:conditions => [...]) – 2011-03-21 03:08:39

+0

拍攝,我的意思是讓.size()添加到這些結尾。 – mnelson 2011-03-21 03:36:46