我有一个Show
has_many
Artists
。当我查询节目时,我在其中:include
:artists
。然而,
当我shows.first.artists.count
时,这会产生一个新的查询 - 效率不高。
我的问题是
a)为什么再次查询我:在查询中包含艺术家?
b)我可以做些什么来阻止这种情况,并且每次调用计数时都要避免查询
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)
然后我通过artsits进行交互计数,并为艺术家生成此查询:
(0.4ms) SELECT COUNT(*) FROM `artists` WHERE `artists`.`show_id` = 2
答案 0 :(得分:2)
虽然关联和数组通常表现相同但存在一些差异。
在数组length
上,count
,size
都是同一方法的别名。
关于协会:
count
始终进行select count(*) from ...
查询length
始终加载整个关联,然后返回已加载数组的长度size
会调用length
,如果不加载,则会调用count
答案 1 :(得分:0)
您可以使用shows.first.artists.size
来避免额外查询。