我有三个问题:
1)file_or_folder
和dataset
都有很多metainstance
。给定以下查询:
p= Metainstance.find(:first, :conditions=>["file_or_folder_id=? AND dataset_id=?", some.id, dataset_id],:include=>[:file_or_folder,:dataset])
急切加载是否适用于file_or_folder
和dataset
?另外,编写这个查询的最佳方式是什么?
2)如果我需要检索大量的数据,使用joins
或includes
选项或使用作用域编写查询是否更有效?
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系列中找到其中的一些方法。