活动记录:包括限制

ADA*_*DAM 16 ruby activerecord ruby-on-rails ruby-on-rails-3

我有一张包含许多图像的文章表

对于每个文章对图像进行排序,其中第一个有序图像旨在作为文章缩略图.

在Article控制器索引方法中,我目前正在执行以下操作以限制2个活动记录查询;

@articles = Article.where(:active => true).includes(:images)
Run Code Online (Sandbox Code Playgroud)

并访问缩略图:

# article model
def thumb
 self.images.first if self.images
end
Run Code Online (Sandbox Code Playgroud)

问题是这只有2个查询,但如果每篇文章有10个图像,并且每页有50篇文章,那么我已经将500个图像行加载到内存中.

在活动记录中是否有更有效的方法.希望不必使用find_by_sql

Dam*_*ien 20

2个查询

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

# app/model/article.rb
has_one :thumb, :class_name => 'Image',
                :conditions => { :ordinal => 1 }
Run Code Online (Sandbox Code Playgroud)

1个查询

如果某些物品没有拇指,请不要使用此解决方案

如果要在连接表上指定条件,可能应该使用joins而不是includes:

@articles = Article.joins(:images)
                   .where(:active => true, 
                          :images => { :ordinal => 1 })
                   .includes(:images)
Run Code Online (Sandbox Code Playgroud)

它只加载图像在哪里 :ordinal => 1

我希望它有所帮助

在为预先加载的关联指定条件时joins之间的区别includes:

"即使Active Record允许您像加入一样指定热切加载关联的条件,但推荐的方法是使用联接.

[...]

includes生成一个包含LEFT OUTER JOIN的查询,而该joins方法将使用INNER JOIN函数生成一个查询."有关更多帮助,请参阅"Active Record查询接口指南 "中的" 指定Eager Loaded Associations上的条件"部分.