在Rails中,是否Eagerloading适用于查询的where条件?如何提高应用程序的性能,除了使用页面缓存



我有三个问题:

1)file_or_folderdataset都有很多metainstance。给定以下查询:

p= Metainstance.find(:first, :conditions=>["file_or_folder_id=? AND dataset_id=?", some.id, dataset_id],:include=>[:file_or_folder,:dataset])

急切加载是否适用于file_or_folderdataset ?另外,编写这个查询的最佳方式是什么?

2)如果我需要检索大量的数据,使用joinsincludes选项或使用作用域编写查询是否更有效?

3)我不能使用页面缓存,因为我有不断变化的动态内容。我还能如何提高Rails应用程序的性能?

1)首先,find(:first)已经被弃用很长时间了。它最终在Rails 4中消失了。下面是这个问题在现代的样子(无耻地抄袭了meagar的评论):

Metainstance.
  where(:file_or_folder_id => some.id, :dataset_id => dataset_id).
  includes(:file_or_folder, :dataset)
那么,关于这个问题:以这种方式进行主动加载意味着会发生以下情况:
  • 首先,Rails将加载与的条件匹配的环境查询。
  • 第二,它将加载所有关联的FileOrFolders
  • 最后,它将加载与这些相关的所有数据集Metainstances。

我认为这意味着你的问题的答案是"是的,急切加载应用where子句的内容。"

2)我想我们在上面关于查找器方法的讨论中已经涵盖了这一点。我不认为它们实际上效率更低。只是更丑,被弃用了。上面的代码是运行这样一个查询的正确方法。

3)几乎有整本书都在讨论如何提高Rails应用程序的性能。在别人给你有意义的建议之前,你必须更具体地说明你正在运行的查询,以及你如何使用它的结果。

a)是的,它确实执行即时加载。我可以这样写

p= Metainstance.where(:file_or_folder_id => some.id, :dataset_id => dataset_id).includes([:file_or_folder, :dataset]).first

这也可以进行即时加载。

b)如果稍后使用file_or_folder和dataset,那么最好使用include(这样可以避免n+1问题)。如果您不使用它们,只是需要连接表,那么连接是更快的方法。

c)有很多方法可以提高应用程序的性能,你可以在Scaling Rails Screencast系列中找到其中的一些方法。

相关内容

最新更新