【问题标题】:How to increase performance using association in rails如何在 Rails 中使用关联来提高性能
【发布时间】:2017-05-06 07:37:49
【问题描述】:

您好,谁能告诉我,如果关联返回较大的数字,我该如何提高性能。的记录。例如在我的应用中:-

class Restaurant < ActiveRecord::Base
  has_many :inventory_items
end

class InventoryItem < ActiveRecord::Base
  belongs_to :vendor
end

我正在尝试查找我的餐厅的供应商,如下所示:-

current_restaurant.inventory_items.includes(:vendor).uniq

current_restaurant.inventory_items 返回大号。需要最长时间的记录。那么我该如何减少这个时间,请帮助我。

【问题讨论】:

  • 你能告诉我们供应商型号吗?
  • 我的 rails 应用程序正在 ruby​​-1.9.2-p290 上运行,现在我想升级它。你知道我应该升级哪个导轨,导轨 4 还是导轨 5?
  • 我建议您接受这个问题的答案,并要求您创建另一个问题,而不是在 cmets 中提问

标签: ruby-on-rails ruby associations


【解决方案1】:

根据应用程序的配置方式和需要执行的操作,您可以使用多种解决方案 -

  1. 仅选择您想要的列,例如,如果您只查找 ID,则可以使用 pluckselect 方法。
  2. 正如 Chetan 在他的回答中建议的那样,您还可以添加范围,除此之外,还可以根据列的类型为范围中的列添加索引。
  3. 如果您正在查看计算值,请考虑将它们缓存在 Restaurant 表中。

【讨论】:

  • 我的 rails 应用程序正在 ruby​​-1.9.2-p290 上运行,现在我想升级它。你知道我应该升级哪个导轨,导轨 4 还是导轨 5?
  • 强烈建议您升级到最新的稳定版 Rails。截至目前,它应该是 rails 5。
【解决方案2】:

您可以为模型添加范围,并为要获取的记录添加条件。喜欢

scope :your_scope_name, -> { includes(:vendor).where(*some more conditions*) }

这将有助于查询不遍历所有数据

【讨论】:

  • 如果 current_restaurant.inventory_items 返回数千条记录会怎样?
  • 您想要所有记录?
  • 不,我只想要供应商。 current_restaurant.inventory_items.map(&:vendor).uniq 因为 current_restaurant.inventory_items 这一行需要太多时间,因为它返回了数千条记录。
  • @awsmsid 如果你想要供应商,为什么不Vendor.all ?? inventory_item -&gt; vendor 关联是可选的吗?
  • 井图最快
【解决方案3】:

使用分页,从不推荐加载所有记录..

will_paginatekaminari 宝石


更新:

class Restaurant < ActiveRecord::Base
  has_many :inventory_items
  has_many :vendors, through: :inventory_items
end

那么,

current_restaurant.vendors.uniq

【讨论】:

  • farhan 我不能使用分页。我有三个表,我必须只找到 current_restaurant 的供应商,如上所述。餐厅和库存项目之间的关联返回了数千条记录,现在告诉我如何处理它。最后我必须找到供应商。
  • 我不是反对者,但分页通常是一个视图问题,我们希望对我们的数据进行页面视图,OP 的性能问题显然在模型级别
  • @awsmsid 你需要inventory 还是只需要vendors
  • 我只需要供应商
  • 感谢 Farhan Memon 博士 :) 我没有考虑到这一点。非常感谢:)
【解决方案4】:

这取决于表的大小和它们的索引方式,一个子查询可能比一个巨大的连接更快:

Vendor.where(id: current_restaurant.inventory_items.select(:vendor_id).distinct)

【讨论】:

  • 我的 rails 应用程序正在 ruby​​-1.9.2-p290 上运行,现在我想升级它。你知道我应该升级哪个导轨,导轨 4 还是导轨 5?
  • Rails 4.2 has reached end-of-life 已经。因此,我建议(逐步)升级到 Rails 5.1。
  • in steps 意味着 rails 3 到 rails 4 然后是 rails 5?
  • 是的,但我什至建议分小步进行更新:3.0、3.1、3.2、4.0、4.1、4.2、5.0、5.1。这听起来像是更多的工作,但实际上小步骤更容易。您将找到任何有关在每个步骤中更改内容的博客文章。如果您尝试一步更新到 5.1,您可能会同时收到很多不同的错误,并且可能不清楚它们可以从哪里以及在应用程序中进行哪些更改。
  • 感谢您的建议 :)
猜你喜欢
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多