Это хорошая оптимизация загрузки? - PullRequest
0 голосов
/ 28 августа 2018

После установки Bullet gem я начал заниматься парой проблем n + 1.

Ранее я использовал оператор безопасной навигации для проверки текущей подписки учетной записи, принадлежащей current_user:

def current_subscription
  @current_subscription ||= current_user&.account&.subscription #n+1 scenario
  @current_subscription
end

Я рефакторинг с новым запросом с использованием .try ():

def current_subscription
  @current_subscription ||= Subscription.where(account_id: current_user.try(:account_id)).first
  @current_subscription
end

Кажется, это работает нормально: мои тесты все еще проходят, и Пуля удовлетворена.

Это хорошая практика или есть лучший подход?

Спасибо.

1 Ответ

0 голосов
/ 28 августа 2018

Вам не нужна эта секунда @current_subscription, ее значение все равно будет возвращено методом current_subscription. Это может не сработать, если у вас есть Subscription с account_id, равным null В ActiveRecord есть метод с именем find_by, который делает то, что вы пытаетесь сделать:

def current_subscription
  @current_subscription ||= Subscription.find_by(account_id: current_user&.account_id)
end
...