2014-11-14 8 views
0

Мне нужно сделать кучу запросов.Как уменьшить количество запросов в этом случае на Rails

В этом случае я думаю, что я запрашиваю результат во много раз,

Не завершен в одном запросе.

Как сделать результаты поиска можно сделать по одному запросу?

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

Первое, что нужно понимать, что 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) 
Смежные вопросы