我有一张有许多图片的文章表
图像是为每一篇文章排序的,第一个有序的图像是文章的缩略图。
在文章控制器索引方法我目前正在做的以下工作,以限制2个活动记录查询;

@articles = Article.where(:active => true).includes(:images)

要访问缩略图:
# article model
def thumb
 self.images.first if self.images
end

问题是这仅仅是2个查询,但是如果每篇文章有10个图片,而我每页有50篇文章,那么我已经将500个图片行加载到内存中。
在活动记录中有没有更有效的方法来做这件事。希望不用使用find_by_sql

最佳答案

2个查询

@articles = Article.where(:active => true).includes(:thumb)

# app/model/article.rb
has_one :thumb, :class_name => 'Image',
                :conditions => { :ordinal => 1 }

1查询
如果有些文章没有经验,不要使用这个解决方案
如果要在联接表上指定条件,可能应该使用joins而不是includes
@articles = Article.joins(:images)
                   .where(:active => true,
                          :images => { :ordinal => 1 })
                   .includes(:images)

它只加载:ordinal => 1
我希望能帮上忙
在指定紧急加载关联的条件时joinsincludes之间的差异:
“尽管active record允许您像joins一样指定急切加载的关联的条件,但推荐的方法是使用joins。
[…]
includes生成一个包含左外部联接的查询,而joins方法将使用内部联接函数生成一个查询。“有关进一步帮助,请参阅the Specifying Conditions on Eager Loaded Associations section in Active Record Query Interface Guide

关于ruby-on-rails - 事件记录:包括限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8293032/

10-10 08:15