Каков наилучший способ кэширования запросов к базе данных для объекта службы внутри итераций? - PullRequest
0 голосов
/ 14 января 2019

У меня есть объект обслуживания рельсов - CarChecker и модель AvailableCar:

class CarChecker
  def car_is_available?(car)
    list_of_available_cars.include?(car)
  end

  def list_of_available_cars
    AvailableCar.all.map { ... }
  end
end

Тогда я проверяю каждую машину где-нибудь в контроллере

cars.each do |car|
  CarChecker.new().car_is_available?(car)
end

Как мне избежать отправки запроса AvailableCar.all для каждой итерации и отправить его только один раз? Как лучше всего кэшировать такое поведение?

1 Ответ

0 голосов
/ 14 января 2019

Вы часто видите методы, присваивающие переменные экземпляра для кэширования, как это.

def list_of_available_cars
  @allcars ||= AvailableCar.all.map { ... }
end

При первом вызове list_of_available_cars будет выполнено AvailableCars.all..., а результат будет сохранен в переменной экземпляра. В последующее время сохраненное значение будет возвращено.

Чтобы это работало таким образом, вам нужно будет повторно использовать один и тот же экземпляр класса обслуживания.

checker = CarChecker.new
cars.each do |car|
  checker.car_is_available?(car)
end

Если вам нужно каждый раз использовать новый экземпляр CarChecker, тогда вы можете использовать переменную класса вместо переменной экземпляра (т.е. использовать @@ вместо @):

def list_of_available_cars
  @@allcars ||= AvailableCar.all.map { ... }
end

Пока ваш AvailableCar.all.map { ... } всегда будет возвращать один и тот же результат, это должно быть хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...