0

例如,在 Ruby on Rails 上,如果 Actor 模型对象是 Tom Hanks,而“has_many”粉丝是 20,000 个 Fan 对象,那么

actor.fans

给出一个包含 20,000 个元素的 Array. 可能,元素没有预先填充值?否则,从数据库中获取每个 Actor 对象可能会非常耗时。

所以它是在“需要知道”的基础上吗?

那么访问actor.fans[500]时是否拉取数据,访问actor.fans[0]时是否拉取数据?如果它从每条记录跳到另一条记录,那么它将无法通过执行顺序读取来优化性能,这在硬盘上可能会更快,因为这些记录可能位于附近的扇区/盘片层——例如,如果程序接触 2 个随机元素,那么仅读取这 2 条记录会更快,但是如果它以随机顺序接触所有元素,那么仅以顺序方式读取所有记录,然后处理随机记录可能会更快元素。但是 RoR 怎么知道我是只做几个随机元素还是随机做所有元素?

4

2 回答 2

1

查看开发模式下服务器喷出的 SQL,它会告诉您正在加载多少粉丝记录。在这种情况下actor.fans,确实会导致它们全部被加载,这可能不是您想要的。

你有几个选择:

  • 按照 Tadas 的建议使用分页器;
  • 与fans 表建立另一个关联,只提取您感兴趣的那些。这可以通过has_many 语句上的条件来完成,例如
    has_many :fans, :conditions => "country of residence = 'UK'"
  • 指定完整的 SQL 以缩小使用:finder_sql选项返回的行
  • 指定:limit将限制返回的行数的选项。

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

于 2010-05-23T15:51:22.160 回答
1

如果只使用其中 2 条记录,为什么要获取 50000 条记录?然后只从数据库中获取这两个。如果你想列出粉丝,那么你可能会使用分页 - 即在查询中使用限制和偏移量,或者像 will_paginate 这样的分页 gem。

我看不出有什么合乎逻辑的解释,为什么你应该按照你尝试的方式去做。解释一个真实的情况,以便我们为您提供帮助。

但是,有人认为您需要知道从 DB 加载许多关联对象的方法 - 使用 :include like

Actor.all(:include => :fans)

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

于 2010-05-23T14:35:58.980 回答