2013-01-09 43 views
1

我有一個Showhas_manyArtists。當我查詢一個節目時,我在其中有:include:artists。但是, 當我做shows.first.artists.count,這會導致一個新的查詢 - 這不是很有效。activerecord:包括計數使另一個查詢?

我的問題是

一)爲什麼又是我查詢:在查詢的藝術家?

二)有什麼事阻止這一點,避免查詢的每次我叫計數

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爲計數interate並生成此查詢的藝術家:

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

什麼是SQL第二個查詢? – Tyson

+0

@Tyson我會更新我的問題,一秒鐘。 – 0xSina

回答

0

您可以使用shows.first.artists.size而不是避免額外的查詢。

2

雖然關聯和數組通常表現相同,但有一些差異。

在陣列上lengthcountsize都是同一個方法的別名。

在一個關聯:

  • count總是做一個select count(*) from ...查詢
  • length總是加載整個關聯,然後返回加載的陣列的長度
  • size將調用length如果關聯已如果不是
+0

您能否提供一個參考? – Davidann

+0

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations/collection_association.rb#L213 –