避免加载关联的关系对象

时间:2011-06-19 14:47:11

标签: ruby-on-rails ruby ruby-on-rails-3 object associations

我正在使用Ruby on Rails 3.0.7,出于性能原因,我想避免在检索类obect时加载相关对象。也就是说,如果我有一个带有Article语句的has_many :users class \ model,我想在检索User对象时不加载关联的Article对象(我认为这个行为取决于Ruby on Rails“约定优于配置”原则。)

我该怎么做?

2 个答案:

答案 0 :(得分:4)

正如Yet Another Geek所述,Rails(ActiveRecord)默认情况下不加载关系对象。相反,它会在你要求它们的时候得到它们。如果您不需要该关系的对象,则永远不会费心加载它们,从而节省了数据库时间。

如果你确实需要,那么它会懒惰地检索它们(默认情况下)。如果你知道你需要关系的所有(或许多)对象(假设是x对多),那么你可以使用:include修饰符来find来完成它们前面(由于它可以通过单个数据库调用来实现,因此速度会快很多)。了解并利用热切加载关系对象的能力是一件重要的事情。

@person = Person.find(params[:id], :include => :friends)

所有这一切,您想要的行为(如果您不需要它们,则不加载对象)是默认行为,您应该全部设置。其余的答案只是一些可能对您有用的背景。

答案 1 :(得分:2)

这篇wiki文章暗示,默认情况下加载是惰性的。如果您希望急切加载,则必须包含:users关系。