安装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满意。
这是一种好的做法还是有更好的方法?
谢谢。
答案 0 :(得分:0)
您不需要第二个@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