我正在使用Ruby on Rails 3.0.7,出于性能原因,我想避免在检索类obect时加载相关对象。也就是说,如果我有一个带有Article
语句的has_many :users
class \ model,我想在检索User
对象时不加载关联的Article
对象(我认为这个行为取决于Ruby on Rails“约定优于配置”原则。)
我该怎么做?
答案 0 :(得分:4)
正如Yet Another Geek所述,Rails(ActiveRecord)默认情况下不加载关系对象。相反,它会在你要求它们的时候得到它们。如果您不需要该关系的对象,则永远不会费心加载它们,从而节省了数据库时间。
如果你确实需要,那么它会懒惰地检索它们(默认情况下)。如果你知道你需要关系的所有(或许多)对象(假设是x对多),那么你可以使用:include
修饰符来find
来完成它们前面(由于它可以通过单个数据库调用来实现,因此速度会快很多)。了解并利用热切加载关系对象的能力是一件重要的事情。
@person = Person.find(params[:id], :include => :friends)
所有这一切,您想要的行为(如果您不需要它们,则不加载对象)是默认行为,您应该全部设置。其余的答案只是一些可能对您有用的背景。
答案 1 :(得分:2)
这篇wiki文章暗示,默认情况下加载是惰性的。如果您希望急切加载,则必须包含:users关系。