2013-02-21 30 views
1

我试图优化我的Rails 2应用程序,以限制mySQL查询数量。 这里有一个简单的例子,用3个模型:Gem will_paginate忽略:包含ActiveRecord参数的查找方法

一篇文章有​​很多图片,通过一个连接模型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是文章和图片之间的连接模式,以“序列”字段。

class ArticlesPicture < ActiveRecord::Base 
    belongs_to :article 
    belongs_to :picture 
end 

A图片可以属于很多文章。

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 `articles_pictures`.* 
FROM `articles_pictures` 
WHERE (`articles_pictures`.article_id IN (1,2,3,4,5,6,7,8,9,10,11,12,.....) 

有我忘了任何选项?

问候

皮埃尔

回答

3

第一件事,用allpagination意味着no using pagination。使用all使heavy loaddb上。它将加载memory中的所有数据。对于大数据,需要加载long time。有时可能crash具有完整的内存。因此,我们使用pagination加载some data at a time以使用户响应更快。所以不要使用all

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

使用这样的:

@articles = Article.paginate(:per_page => 50) 
@articles = Article.paginate(:per_page => 50, :include => :main_picture) 
+0

我写“一切”这个页面上,因为我的实际使用情况下调用一些命名范围。您的解决方案有效:非常棒! – pierallard 2013-02-21 17:05:29

+0

我不能,我是一个新手,我需要做我的声望。我唯一能做的就是谢谢你这样:) – pierallard 2013-02-21 17:33:31

+0

完成!再次感谢 – pierallard 2013-02-22 08:11:50