1

私はそれを持ってShowhas_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)

次に、 count に対して artits を操作すると、次のように artist に対してクエリが生成されます。

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

2 に答える 2

2

多くの場合、関連付けと配列は同じように動作しますが、いくつかの違いがあります。

配列lengthではcountsizeはすべて同じメソッドのエイリアスです。

関連付け:

  • count常にselect count(*) from ...クエリを実行します
  • length常に関連付け全体をロードし、ロードした配列の長さを返します
  • sizelength関連付けが既に読み込まれている場合は呼び出され、countそうでない場合は呼び出されます
于 2013-01-09T21:06:04.237 に答える
0

代わりに使用shows.first.artists.sizeして、余分なクエリを回避できます。

于 2013-01-09T20:08:52.670 に答える