我需要做一堆查询。
在这种情况下,我认为我多次查询结果,
未在一个查询中完成。
如何使我的搜索结果可以通过一个查询完成?
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)
答案 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)