为特定数据属性持续调用父模型是否效率低下?



假设在某些Child模型方法上,我需要根据存储在其Parent模型上的一些数据进行计算。例如

def child_method(minutes)
remaining_time = minutes % self.parent.parent_settings
if remaining_time >= 1
return minutes/ self.parent.parent_settings
else
return [minutes/self.parent.parent_settings - 1 , 0].max
end
end

在上面我已经给self.parent.parent_settings打了3次电话。根据Rails的工作方式,这是有效的吗?或者这是一个糟糕的主意,我应该在本地设置parent_settings,例如:

def child_method(minutes)
parent_settings = self.parent.parent_settings
remaining_time = minutes % parent_settings
if remaining_time >= 1
return minutes/ parent_settings
else
return [minutes/parent_settings - 1 , 0].max
end
end

我有更复杂的实例(例如,在一个子方法中,我正在访问多个父属性,在某些情况下,还有祖父属性(。我意识到答案可能是"这取决于"确切的数据等,但看看是否有一般的经验法则或惯例

就像你说的,这取决于。

只要对象保留在内存中,Rails 就会缓存获取的关联:

puts self.parent.parent_settings.object_id
# ... Some code
puts self.parent.parent_settings.object_id # => This should be the same object ID as before

此缓存由框架自动清除,并可通过#reload显式清除:

self.reload

只要您没有在请求/响应周期中多次运行child_method,您的代码就应该没问题。即使您在同一请求/响应周期中多次运行child_method,也会有另一个数据库查询缓存拦截相同的数据库查询。数据库查询缓存仅在处于生产模式或设置特殊 ENV var 时处于活动状态。

相关内容

最新更新