1

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,.....)

忘れたオプションはありますか?

よろしく

ピエール

4

1 に答える 1

3

まず、手段allとともに使用します。makeonを使用します。にすべてのデータをロードします。大きなデータの場合、ロードに時間がかかります。フルメモリの場合もあります。そのため、ユーザーの応答性を高めるためにロードに使用します。したがって、は使用しないでください。 paginationno using paginationallheavy loaddbmemorylong timecrashpaginationsome data at a timeall

 @articles = Article.all.paginate(:per_page => 50)

このように使用します:

 @articles = Article.paginate(:per_page => 50)
 @articles = Article.paginate(:per_page => 50, :include => :main_picture)
于 2013-02-21T16:58:26.527 に答える