1

我有三个问题:

1) 每个file_or_folder都有dataset很多metainstances。给定以下查询:

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 应用程序的性能?

4

2 回答 2

1

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(不是任何其他查询)。
  • 最后,它将加载与这些元实例关联的所有数据集。

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

2)我认为我们在上面对查找器方法的讨论中涵盖了这一点。我不认为它们实际上效率低下,就其本身而言。只是更丑陋和过时。上面的代码是运行这样的查询的正确方法。

3) 实际上有整本关于提高 Rails 应用程序性能的书籍。您必须更具体地了解您正在运行的查询以及您如何使用查询结果,然后任何人才能就此提供有意义的建议。

于 2013-06-12T18:53:09.443 回答
0

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,那么最好使用包含(并且避免 n+1 问题)。如果您不使用它们并且只需要连接表,那么连接是更快的方法。

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

于 2013-06-12T18:56:34.310 回答