Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.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 在视图中运行昂贵的方法与在控制器中运行昂贵的方法-Rails_Ruby On Rails - Fatal编程技术网

Ruby on rails 在视图中运行昂贵的方法与在控制器中运行昂贵的方法-Rails

Ruby on rails 在视图中运行昂贵的方法与在控制器中运行昂贵的方法-Rails,ruby-on-rails,Ruby On Rails,冒着被贴上“过于宽泛”标签的风险,但这是一个真实的疑问 说我有 @my\u model.复杂的计算结果显示在视图中 有哪些优点和缺点: 1-计算控制器上的值并将其发送到视图 控制器: @result=@my_model.complex_calculation_result#在控制器中缓存值 视图: 2-直接在视图中计算它 我知道最后一个选择代表更少的代码,我有一个更少的实例变量挂起 但是否存在性能差异 Guess 1-视图已经需要更多的内存来渲染所有内容,因此如果内存昂贵,则从视图内部进行计

冒着被贴上“过于宽泛”标签的风险,但这是一个真实的疑问

说我有
@my\u model.复杂的计算结果
显示在视图中

有哪些优点和缺点:

1-计算控制器上的值并将其发送到视图

控制器:

@result=@my_model.complex_calculation_result#在控制器中缓存值

视图:

2-直接在视图中计算它

我知道最后一个选择代表更少的代码,我有一个更少的实例变量挂起

但是否存在性能差异

Guess 1-视图已经需要更多的内存来渲染所有内容,因此如果内存昂贵,则从视图内部进行计算可能需要更长的时间


如对此有任何说明和评论,将不胜感激。:)

虽然我没有回答您问题的性能部分,但您在第二条道路上违反了Rails MVC原则。该视图不用于对模型数据执行任何(特别复杂)计算。

TL;博士

在内存的情况下,我认为唯一一种可能是“放慢速度”是当您超过内存并开始使用交换文件时。我还没有深入研究rails,但如果我们考虑到您的想法,认为平均控制器执行需要
X
内存,平均视图需要
1.3*X
(我头脑中的绝对随机系数),那么从视图进入交换的机会会稍大一些,而从控制器进入交换的机会会稍大一些。若我的想法是正确的,那个么控制器在技术方面更好

在概念方面。视图仅用于渲染结果,在您的情况下,我肯定会将这个沉重的方法移到视图之外。您关心的是“附加实例变量”,并且您的关注是正确的

我的团队遵循Sandy Metz的规则。缔约国之一:

仅向视图传递一个单实例接口(变量)。如果你 需要多个实例变量,然后用 门面模式并让此门面提供您需要的所有接口

所以。。。我将设置一个facade并将这个沉重的方法包装到它的一个属性中

所以我们有2-0将其放入控制器中

PS:我非常担心延迟加载等问题。。。。我认为facade方法只有在实际调用之后(而不是在实例初始化期间)才会计算,所以对于实际情况,您的慢逻辑仍将仅在视图中被调用(在第一次实际调用期间,请参考此方法)。我认为可以通过在Facade构造函数中进行所有计算来防止这种情况的发生
initialize
,并将结果放入实例变量中,然后从视图中引用这个带有结果的变量。。。。但是


我甚至不确定,这个变量是否会在第一次实际使用之前计算出来(也有可能存在这样的机制,使优化不执行尚未使用的内容。因为ActiveRecord在方法链接期间会做这样的事情。除非您真正引用某个对象,否则不会执行真正的SQL)。所以我担心,即使将此方法移动到Facade构造函数中,最终也可能只在视图中计算它。但是,您可以通过日志/调试器进行检查,以确保这种昂贵的计算需要在运行中进行吗?或者您可以使用后台处理器来计算结果并将其存储在表中吗?请在后台使用后台处理器,如rake任务,否则您的用户将遇到超时,这将导致复杂性和脾气暴躁