在Ruby on Rails上,说,如果演员模型对象是汤姆·汉克斯(Tom Hanks),而“ has_many”粉丝是20,000个粉丝对象,那么

actor.fans

给出一个有20,000个元素的阵列。大概,这些元素不是预先填充的值吗?否则,从数据库中获取每个演员对象可能非常耗时。

因此,它是“需要知道的”基础?

因此,当我访问Actor.fans [500]时,它会拉数据,并在访问Actor.fans [0]时提取数据?如果它从每个记录跳到每个记录,那么它将无法通过进行顺序读取来优化性能,这可以在硬盘上更快,因为这些记录可以在附近的扇区 /拼盘中 - 例如,如果该程序触摸2个随机元素,然后仅读取这2个记录就会更快,但是如果它以随机顺序触摸所有元素,那么只要以一个顺序读取所有记录,然后处理随机读取所有元素才能更快元素。但是,Ror如何知道我是只做几个随机元素还是随机的所有元素?

有帮助吗?

解决方案

如果仅使用2个记录,为什么要获取50000记录?然后只从DB获取这两个。如果您想列出风扇,那么您可能会使用分页 - IE在查询中使用限制和偏移,或者像will_paginate这样的分页宝石。

我看不到逻辑上的解释,为什么您应该按照自己的尝试。解释一个真实情况,以便我们可以为您提供帮助。

但是,有人认为您需要知道wile加载db中的许多相关对象 - 使用:包括

Actor.all(:include => :fans)

这将急切地加载所有粉丝,因此只有2个查询而不是n+1,其中n是一定数量的演员

其他提示

查看服务器在开发模式下喷出的SQL,这将告诉您加载了多少个粉丝记录。在这种情况下 actor.fans 确实会导致所有人都被加载,这可能不是您想要的。

您有几个选择:

  • 使用Tadas建议的Paginator;
  • 与粉丝表建立另一个关联,只能吸引您感兴趣的桌子。这可以在has_many语句中的条件下完成,例如
    has_many :fans, :conditions => "country of residence = 'UK'"
  • 指定完整的SQL以缩小与返回的行 :finder_sql 选项
  • 指定 :limit 选项将限制返回的行数。

一切都取决于您想做什么。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top