假设在某些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 时处于活动状态。