Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 连续调用特定数据属性的父模型是否效率低下?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 连续调用特定数据属性的父模型是否效率低下?

Ruby on rails 连续调用特定数据属性的父模型是否效率低下?,ruby-on-rails,ruby,Ruby On Rails,Ruby,假设在一些子模型方法中,我需要根据存储在其父模型中的一些数据进行计算。比如说, 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.par

假设在一些
模型方法中,我需要根据存储在其
模型中的一些数据进行计算。比如说,

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\u设置
3次。根据Rails的工作原理,这是否有效?或者这是一个糟糕的主意,我应该改为在本地设置
parent\u设置
,例如:

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\u方法
,您的代码就应该没有问题。即使在同一请求/响应周期内多次运行
child\u方法
,也会有另一个数据库查询缓存截获相同的数据库查询。db查询缓存仅在处于生产模式或设置了特殊环境变量时才处于活动状态。

无需在标题中添加“Rails-”;这就是标签的作用。你要问的确切上下文是什么?我的意思是,如果它是一个参考,那么任何性能差异都将是最小的。“我可以计时,你知道。”达文尼顿我可以计时,但我想知道是否有既定的经验法则。有一件事我很好奇,调用
self.parent.parent\u settings
是否会不断地重新加载父对象?我知道,rails会将其保存在内存中,除非调用某些方法(where/count)这将生成一个数据库查询。调用self.parent.parent\u设置不会不断重新加载父对象。您可以在rails控制台中进行检查,只有在第一次调用记录上的parent.parent\u设置时才会生成查询。