【问题标题】:N+1 issue for custom method in railsRails 中自定义方法的 N+1 问题
【发布时间】:2019-04-01 23:44:02
【问题描述】:

在我的 rails 应用程序中,我有一个 User 模型,其方法名为 price_tier

def price_tier
  Spree::PriceTier.by_code[read_attribute(:price_tier)]
end

但是,当我有一个 @users 的集合并一个一个调用 price_tier 时,它将为每个实例加载 PriceTier 查询,这会导致 N+1 问题。

includes 在这里不起作用,因为它不是一个关联。

@users.map { |user| user.price_tier }

有没有办法修改修复N+1问题的代码?

【问题讨论】:

  • user 和 price_tier 有什么关系?
  • @Subash 它将通过代码搜索price_tieruser.price_tier == price_tier.code。但是没有has_many等关联。

标签: ruby-on-rails select-n-plus-1


【解决方案1】:

您确实应该直接设置模型之间的关系,例如user has_one :price_tier。这将使这里的代码变得轻而易举。

如果您不这样做,那么您就是在为一些应该直截了当的事情而跳槽。你可以也许使用类似下面的东西,尽管它仍然远不如直接关系有效:

tiers = Spree::PriceTier.where(code: @users.pluck(:price_tier))
                        .each_with_object({}) { |tier, hash| hash[tier[code]] = tier }

@users.map { |user| tiers[user.price_tier] }

注意以上假设删除实例方法:price_tier 并使用属性。

我不确定是否真的值得包括上述内容 - 您收集用户的 price_tier,为层点击数据库(仅一次,而不是为每个用户),遍历所有层以创建哈希以快速访问,然后遍历用户来映射这些。对于通过建立关系很容易解决的事情来说,这是很多工作。

希望对您有所帮助,并且真的希望在上面的语气中表现良好 - 基本上意味着您可以做类似上面的事情,但真正的建议是:请不要,设置一个与这里的传统方法的关系和工作:)

【讨论】:

  • 这对@Stephen 有帮助吗?
猜你喜欢
  • 2011-09-24
  • 2015-02-12
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多