has_many(through)アソシエーションでの検索(続き)

きのうの続きです。

will_pagination

以下のようにしてwill_paginationを使った場合も使えそうです。

     products = Product.find(:all,
      :include => [:keywords],
      :conditions => ["keywords.word = ?", "beatles"] ,
      :order => "price",
      :page=> 1,
      :per_page => 5 )

このとき実行されるSQLは、IDを得るためのSQL,そのIDから実際の行データを検索するSQL, カウントのSQLの3つでした。パフォーマンス的にはどうなんだろう?

SELECT DISTINCT `products`.id FROM `products` 
  LEFT OUTER JOIN `keyword_products` 
       ON (`products`.`id` = `keyword_products`.`product_id`) 
  LEFT OUTER JOIN `keywords` 
       ON (`keywords`.`id` = `keyword_products`.`keyword_id`) 
  WHERE (keywords.word = 'beatles') ORDER BY price LIMIT 0, 5

SELECT `products`.`id` AS t0_r0,  `products`.`name` AS t0_r3,  ....
  LEFT OUTER JOIN `keyword_products` 
       ON (`products`.`id` = `keyword_products`.`product_id`) 
  LEFT OUTER JOIN `keywords` 
       ON (`keywords`.`id` = `keyword_products`.`keyword_id`) 
  WHERE (keywords.word = 'beatles') AND `products`.id IN (34, 118, 134, 266, 330) ORDER BY price

SELECT count(DISTINCT `products`.id) AS count_all FROM `products` 
  LEFT OUTER JOIN `keyword_products` 
       ON (`products`.`id` = `keyword_products`.`product_id`) 
  LEFT OUTER JOIN `keywords` 
      ON (`keywords`.`id` = `keyword_products`.`keyword_id`) 
  WHERE (keywords.word = 'beatles')