我有一个在user
对象上调用的方法,该方法有许多documents
(关联)。
内部方法中,我必须在许多默认情况下呼叫documents
的地方呼叫self
。
因此,我想知道它是否会多次为用户调用文档,并以为我会调用一次并由文档docs = self.documents
或docs = documents
进行引用,因此无论用户文档在哪里,我都将使用此引用是必需的,因此我们可以避免在用户对象上调用关联方法文档
但是它真的一遍又一遍地调用还是只是在被调用时才第一次缓存它?
我在控制台中检查了一下,当我调用user.documents时,它加载了文档(db调用),但稍后又进行了相同的调用。
建议其工作方式。使用引用变量进行首次调用是否很好,并进一步使用它?
答案 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.documents
和user.docs
之间没有区别-它们调用相同的方法。但是,它又有什么作用可以提高代码的可读性?我认为不。
通过拨打电话documents
来坚持。