代码之家  ›  专栏  ›  技术社区  ›  ray

性能-对象上的多关联调用

  •  0
  • ray  · 技术社区  · 6 年前

    我有一个叫做 user documents (关联)。

    我必须调用的内部方法 文件 许多打电话的地方 self 默认情况下。

    所以我想知道它是否会多次为用户调用文档,我想我会调用一次,然后按文档引用, docs = self.documents docs = documents 我将在需要用户文档的任何地方使用此参考;这样我们就可以避免

    但它真的是一次又一次地调用,还是在第一次调用时缓存它?

    我签入了控制台,当我调用user.documents时,它加载了文档(db call),但后来对于同一个调用,它没有加载。

    建议如何工作。在第一次调用中使用引用变量并进一步使用它是否好?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Community user43968    4 年前

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

    例如:

    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 “告诉鲁比” 文件 self.documents ,并且无论调用哪个,Ruby都将从相同的内存位置返回相同的数据。有 a performance difference

    如果你担心你不想打字 文件 一次又一次的当你可以打字的时候 alias_method :

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

    那么打电话也没什么区别 user.documents user.docs --它们调用相同的方法。但是,它是否有助于提高代码的可读性呢?在我看来,没有。

    坚持打电话 文件 .