渴望加载现有对象

时间:2011-01-27 00:36:17

标签: ruby-on-rails activerecord

在rails中,您可以在创建新对象时加急关联:

@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})

似乎有点浪费。

2 个答案:

答案 0 :(得分:5)

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

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

在Rails 3中,您可以使用Rails 3 Way:

 @person.flights.include(:plane)

您可以考虑在:include声明中添加has_many选项,以便在从Person加载时默认包含它:

 has_many :flights, :include => :plane

您可以替换为Flight添加默认范围,从而导致Flight上的任何查询都包含其平面:

 default_scope :include => :plane

答案 1 :(得分:0)

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

您应切换到Rails3,查看Active Record Queries in Rails 3以查看原因!