Rails 2アプリケーションを最適化して、mySQLクエリ数を制限しようとしました。これは、3つのモデルを使用した簡単な例です。
結合モデルArticlePictureを介して、記事には多くの写真があります。「メイン画像」は、画像の順序を尊重する最初の画像です。
class Article < ActiveRecord:Bast
has_many :articles_pictures, :order => 'sequence'
has_many :pictures, :through => :articles_pictures, :order => 'sequence'
has_one :main_picture, :through => :articles_pictures, :source => :picture, :conditions => ["# {ArticlesPicture.table_name}.sequence = ?", 0]
end
ArticlePictureは、ArticleとPictureの間の結合モデルであり、「シーケンス」フィールドがあります。
class ArticlesPicture < ActiveRecord::Base
belongs_to :article
belongs_to :picture
end
写真は多くの記事に属することができます。
class Picture < ActiveRecord::Base
has_many :articles_pictures
has_many :articles, :through => :articles_picture
end
私のコントローラーでは、すべての記事を呼び出して、ページをめくります。
@articles = Article.all.paginate(:per_page => 50)
私の見解では、私は「それぞれ」の呼び出しで記事をリストします
article.main_picture
明らかに、Railsは最初の50枚の写真に対して「SELECT」と呼んでいますが、これはあまり最適化されていません。だから私は記事を
@articles = Article.find(:all, :include => :main_picture).paginate(:per_page => 50)
ただし、Railsは画像テーブル全体に対して「SELECT」を作成します。
SELECT `articles_pictures`.*
FROM `articles_pictures`
WHERE (`articles_pictures`.article_id IN (1,2,3,4,5,6,7,8,9,10,11,12,.....)
忘れたオプションはありますか?
よろしく
ピエール