首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby on Rails "has_many“数组是否在”需要知道“的基础上提供数据?

问Ruby on Rails "has_many“数组是否在”需要知道“的基础上提供数据?
EN

Stack Overflow用户
提问于 2010-05-23 21:43:08
回答 2查看 420关注 0票数 0

在Ruby On Rails上,如果角色模型对象是Tom Hanks,而"has_many“粉丝是20,000个Fan对象,那么

代码语言:javascript
复制
actor.fans

给出一个包含20,000个元素的数组。也许,元素没有预先填充值?否则,从DB获取每个Actor对象可能非常耗时。

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

那么是不是在我访问actor.fans500时拉取数据,在我访问actor.fans时拉取数据呢?如果它从每条记录跳到另一条记录,那么它将不能通过顺序读取来优化性能,这在硬盘上可能更快,因为这些记录可能在附近的扇区/盘片层--例如,如果程序触及2个随机元素,那么只读取这2个记录会更快,但如果它触及随机顺序中的所有元素,那么以顺序读取所有记录,然后处理随机元素可能会更快。但是RoR如何知道我是只做了几个随机元素,还是做了所有的随机元素呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-23 22:35:59

如果只使用其中的2条记录,为什么还要获取50000条记录呢?然后只从DB中获取这两个。如果你想列出粉丝,那么你可能会使用分页-即在你的查询中使用limit和offset,或者像will_paginate这样的分页宝石。

我看不到合理的解释,为什么你应该走你试图走的路。解释一个真实的情况,这样我们才能帮助你。

然而,在从DB加载许多相关对象时,有一点需要知道- use :include like

代码语言:javascript
复制
Actor.all(:include => :fans)

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

票数 1
EN

Stack Overflow用户

发布于 2010-05-23 23:51:22

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

您有几个选项:

​

​

  • 按照Tadas的建议使用分页器;

​

​

  • 与粉丝表建立了另一个关联,只吸引你感兴趣的人。这可以通过has_many语句上的条件来完成,例如

has_many :fans, :conditions => "country of residence = 'UK'"

​

​

  • 指定完整的SQL以缩小使用:finder_sql选项

返回的行的范围。

​

​

  • 指定:limit选项,该选项将限制返回的行数。

​

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2891940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档