在Ruby On Rails上,如果角色模型对象是Tom Hanks,而"has_many“粉丝是20,000个Fan对象,那么
actor.fans给出一个包含20,000个元素的数组。也许,元素没有预先填充值?否则,从DB获取每个Actor对象可能非常耗时。
所以这是在“需要知道”的基础上吗?
那么是不是在我访问actor.fans500时拉取数据,在我访问actor.fans时拉取数据呢?如果它从每条记录跳到另一条记录,那么它将不能通过顺序读取来优化性能,这在硬盘上可能更快,因为这些记录可能在附近的扇区/盘片层--例如,如果程序触及2个随机元素,那么只读取这2个记录会更快,但如果它触及随机顺序中的所有元素,那么以顺序读取所有记录,然后处理随机元素可能会更快。但是RoR如何知道我是只做了几个随机元素,还是做了所有的随机元素呢?
发布于 2010-05-23 22:35:59
如果只使用其中的2条记录,为什么还要获取50000条记录呢?然后只从DB中获取这两个。如果你想列出粉丝,那么你可能会使用分页-即在你的查询中使用limit和offset,或者像will_paginate这样的分页宝石。
我看不到合理的解释,为什么你应该走你试图走的路。解释一个真实的情况,这样我们才能帮助你。
然而,在从DB加载许多相关对象时,有一点需要知道- use :include like
Actor.all(:include => :fans)这将急切地加载所有粉丝,因此将只有2个查询,而不是N+1,其中N是演员的数量
发布于 2010-05-23 23:51:22
看看服务器在开发模式下抛出的SQL,它会告诉你有多少粉丝记录正在加载。在这种情况下,actor.fans确实会导致它们全部加载,这可能不是您想要的。
您有几个选项:
has_many :fans, :conditions => "country of residence = 'UK'"
:finder_sql选项返回的行的范围。
:limit选项,该选项将限制返回的行数。
一切都取决于你想做什么。
https://stackoverflow.com/questions/2891940
复制相似问题