我需要一些帮助来优化以下方法。随着我的数据库大小增加到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现在返回数千条记录。有没有办法将该查询与计数查询相结合,可能是通过在people表上使用:male属性?
有没有办法将Person关联中的条件放入传递给count方法的条件中?
除此之外,有没有人在这种方法中看到减少数据库查询大小和时间的其他方法?
答案 0 :(得分:1)
这应该适合你:
{
:place => Workout.joins(:person).where(["`workouts`.time < ? AND `people`.male = ?", self.time, true]).size,
:entries => Workout.joins(:person).where(:people => {:male => true}).size
}