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')