在哪一点上可以对大型项目进行所有查询以加载所有对象关联?
让我来解释一下这个问题的背景。
目前我正在研究一个在模型和关联方面变得相当复杂的项目。我开始检查服务器日志,发现一些视图需要一些时间来加载,因为查询中包含的嵌套对象。
所以我开始重构某些查询的到这样的事情:什么时候Rails Eager默认加载所有关联是一个好主意?
@process = current_account.processes.query(params)
要这样:
@process = current_account.processes.includes(:messages, :parts, :people).query(params)
结果是相当不错的。在某些视图中,我能够将视图渲染时间和主动记录查询时间缩短70%。
我很高兴的人,所以我决定做更多。但是在做出这个决定之后,我开始注意到并非所有地方都重构了代码,这些变化都很好。事实上,有些查询变得更慢。
要解释一下关于这个问题我有这样一个模型:
而且里面process
belongs_to :user
创建它像这样这些嵌套模式中的每一个:
class Anotation
belongs_to :user
class Reunion
belongs_to :user
class Profile
belongs_to :user
它去上。
在我的show view
的process
中,有几个选项卡显示这些嵌套对象的全部以及将其添加到当前进程的用户的名称。
有了这样的查询:
@process = current_account.processes.query(params)
它执行有点慢。所以,我想是这样的:
@process = current_account.process.includes(:anotations, :publications, :movimentations,
:reunions, :profiles, :messages).query(params)
这使我获得的视图渲染速度,但在ActiveRecord的,在时间检索这些对象已显著上升。而且它提出的天空时,我渴望加载的process
所有嵌套模型这样的内部user
对象:
@process = current_account.process.includes({:anotations => [:user]},
{:publications => [:user], etc...).query(params)
好,重构应用程序的设计,这些协会不同的行为是不会发生的,所以我再问这个问题。
在哪一点很好,使大型项目上的所有查询加载所有的对象关联?
关于这个问题的任何提示/最佳实践/经验将非常感激。
我建议一个标题,如“什么时候Rails加载默认情况下所有关联都是一个好主意? – lulalala 2013-03-12 08:20:12