性能-对对象进行多关联调用

时间:2018-10-31 07:46:04

标签: ruby-on-rails ruby activerecord

我有一个在user对象上调用的方法,该方法有许多documents(关联)。

内部方法中,我必须在许多默认情况下呼叫documents的地方呼叫self

因此,我想知道它是否会多次为用户调用文档,并以为我会调用一次并由文档docs = self.documentsdocs = documents进行引用,因此无论用户文档在哪里,我都将使用此引用是必需的,因此我们可以避免在用户对象上调用关联方法文档

但是它真的一遍又一遍地调用还是只是在被调用时才第一次缓存它?

我在控制台中检查了一下,当我调用user.documents时,它加载了文档(db调用),但稍后又进行了相同的调用。

建议其工作方式。使用引用变量进行首次调用是否很好,并进一步使用它?

1 个答案:

答案 0 :(得分:1)

Rails自动缓存数据库调用的结果。来自Rails Guides

  

查询缓存是一种Rails功能,可缓存每个查询返回的结果集。如果Rails再次对该请求再次遇到相同的查询,它将使用缓存的结果集,而不是再次对数据库运行该查询。

     

例如:

class ProductsController < ApplicationController

  def index
    # Run a find query
    @products = Product.all

    ...

    # Run the same query again
    @products = Product.all
  end

end
  

第二次对数据库运行相同的查询,实际上并没有命中数据库。第一次从查询返回结果时,将结果存储在查询缓存中(在内存中),第二次从内存中将其提取。

     

但是,请务必注意,查询缓存是在操作开始时创建的,并在该操作结束时被销毁,因此仅在操作期间才存在。如果您想以更持久的方式存储查询结果,则可以使用低级缓存。

我的建议是不要将其分配给变量,因为它不能提高代码的可读性,并且性能差异可以忽略不计。这可能会引起混乱;如果我正在阅读代码,并且看到有人用documents替换了所有对docs的呼叫,我想知道为什么,并且需要花一些时间来理解为什么。

最终,设置docs = self.documents只是告诉Ruby“ docs应该指向与self.documents相同的内存位置”,并且无论您调用Ruby哪一个,都会从中返回相同的数据。相同的内存位置。调用方法和调用变量之间有a performance difference,但是与数据库调用速度之类的东西相比,性能差异很小,可以忽略不计。有比将方法调用切换为变量调用更好的方法来提高应用程序的性能。

如果您担心不想在只输入documents的情况下反复输入docs,请使用alias_method

class User < ApplicationRecord
  has_many :documents
  alias_method :docs, :documents
end

然后,调用user.documentsuser.docs之间没有区别-它们调用相同的方法。但是,它又有什么作用可以提高代码的可读性?我认为不。

通过拨打电话documents来坚持。