这是一个很好的渴望加载优化吗?

时间:2018-08-28 16:33:25

标签: ruby-on-rails rails-activerecord

安装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

这似乎很好:我的测试仍然通过,并且Bullet满意。

这是一种好的做法还是有更好的方法?

谢谢。

1 个答案:

答案 0 :(得分:0)

您不需要第二个@current_subscription,无论如何它的值将从current_subscription方法中返回。如果您有Subscriptionaccount_id的任何null,则可能不起作用。ActiveRecord中有一种名为find_by的方法,该方法可以完成您想做的事情: >

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