2011-01-27 45 views
4

在轨可以在创建渴望负载关联的新对象是这样的:现有对象预先加载

@person = Person.find(params[:id], :include => {:flights => :plane}) 

但是,我有时已经有@person对象,然后想急于负载关联。似乎没有任何'轨道'来做到这一点。我期待这样的事情基本上是:

@person = Person.find(params[:id]) 
... 
@person.include({:flights => :plane}) 

背景是,我已经创建不协会@object滤波器之前有一个。但是在一些行动中,如果我不急于加载关联,我会产生很多奇异的查询。并做

@person = Person.find(params[:id]) 
... 
@person = Person.find(params[:id], :include => {:flights => :plane}) 

似乎有点浪费。

回答

5

在Rails 2,你可以使用scoped创建相应的查询:

@person.flights.scoped(:include => :plane) 

在Rails 3,你可以做到这一点了Rails 3路:

@person.flights.include(:plane) 

你可能会考虑增加:include选项has_many声明,因此它从默认情况下包含在Person中:

has_many :flights, :include => :plane 

您可以将默认范围添加到Flight,导致Flight上的任何查询包含其飞机:

default_scope :include => :plane 
0

只需使用@person.flights并在包含飞机的航班上设置default_scope即可。
或在您的人型号:has_many :flights, :include => plane

您应该切换到Rails3,检查出Active Record Queries in Rails 3看看为什么!