1

我有Show一个has_many Artists。当我查询一个节目时,我:include :artists在里面。但是,当我这样做时shows.first.artists.count,这会导致一个新的查询 - 这不是很有效。

我的问题是

a) 为什么再次查询我:在查询中包含艺术家?

b)我能做些什么来阻止这种情况并避免每次调用 count 时都进行查询

c)shows.first.artists.class 是一个数组 - ActiveRecord 是否在数组上覆盖此方法?

更新 这里的代码和查询:

shows = Show.all :include => [:artists, :users], :limit => 12, :offset => 0
D, [2013-01-09T13:32:21.453346 #4659] DEBUG -- :   Show Load (0.5ms)  SELECT `shows`.* FROM `shows` WHERE `shows`.`deleted` = 0 LIMIT 12 OFFSET 0
D, [2013-01-09T13:32:21.497766 #4659] DEBUG -- :   Artist Load (0.4ms)  SELECT `artists`.* FROM `artists` WHERE `artists`.`id` IN (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
D, [2013-01-09T13:32:21.513886 #4659] DEBUG -- :   User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`show_id` IN (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)

然后我通过 artits 对 count 进行交互,它为艺术家生成这个查询:

  (0.4ms)  SELECT COUNT(*) FROM `artists` WHERE `artists`.`show_id` = 2
4

2 回答 2

2

虽然关联和数组的行为通常相同,但存在一些差异。

在一个数组length, count,size都是同一个方法的别名。

在一个协会上:

  • count总是做一个select count(*) from ...查询
  • length总是加载整个关联然后返回加载数组的长度
  • sizelength如果关联已经加载,将调用,count如果没有
于 2013-01-09T21:06:04.237 回答
0

您可以改用它shows.first.artists.size来避免额外的查询。

于 2013-01-09T20:08:52.670 回答