activerecord:include count进行另一个查询?

时间:2013-01-09 19:29:57

标签: ruby activerecord

我有一个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

2 个答案:

答案 0 :(得分:2)

虽然关联和数组通常表现相同但存在一些差异。

在数组length上,countsize都是同一方法的别名。

关于协会:

  • count始终进行select count(*) from ...查询
  • length始终加载整个关联,然后返回已加载数组的长度
  • 如果关联已加载,则
  • size会调用length,如果不加载,则会调用count

答案 1 :(得分:0)

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