我有一张有许多图片的文章表
图像是为每一篇文章排序的,第一个有序的图像是文章的缩略图。
在文章控制器索引方法我目前正在做的以下工作,以限制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
我希望能帮上忙
在指定紧急加载关联的条件时
joins
和includes
之间的差异:“尽管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/