如何在Rails上减少这种情况下的查询数量

时间:2014-11-14 03:59:53

标签: ruby-on-rails activerecord ruby-on-rails-4

我需要做一堆查询。

在这种情况下,我认为我多次查询结果,

未在一个查询中完成。

如何使我的搜索结果可以通过一个查询完成?

  q = WeatherLog.nearby(100, longitude, latitude)
  if start_time and end_time
    @weather_logs = q.where(datetime: start_time..end_time)
  elsif start_time
    @weather_logs =  q.where("datetime > ?", start_time)
  elsif end_time
    @weather_logs =  q.where("datetime < ?", end_time)
  end
    @weather_logs = @weather_logs.order(datetime: :asc).first(2000)

1 个答案:

答案 0 :(得分:1)

要实现的第一件事是ActiveRecord在aboultely必须(延迟加载)之前不执行查询。虽然有许多代码行构建查询,但查询仅在.all.each.first等方法上执行。因此从性能角度来看,您的代码是可以的作为您对数据库的唯一执行一个查询而不是很多。

但是,您可以调整代码,使其更具人性化和可维护性:

class WeatherLog < ActiveRecord::Base
   # ...
   class << self
     def between_times(times)
       after_time(times[:start_time]).before_time(times[:end_time])
     end

     def after_time(time)
       return self.all if time.nil?
       where('datetime > ?', time)
     end

     def before_time(time)
       return self.all if time.nil?
       where('datetime < ?', time)
     end
   end
end

使用self.all有效地跳过查询条件,同时仍启用查询链接。这使得可以删除所有if / else逻辑。然后你可以链接查询(或在WeatherLog中创建一个辅助方法):

WeatherLog.nearby(100, longitude, latitude).between_times(start_time: start_time, end_time: end_time)