渴望加载现有对象

mko*_*kon 4 activerecord ruby-on-rails

在rails中,您可以在创建新对象时急切加载关联,如下所示:

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

但是,我有时已经拥有@person对象,然后想要加载关联.似乎没有任何"轨道"方式来做到这一点.我基本上在寻找这样的东西:

@person = Person.find(params[:id])
...
@person.include({:flights => :plane})
Run Code Online (Sandbox Code Playgroud)

背景是,我有一个前置过滤器,已经创建了没有关联的@object.但是在某些动作中,如果我不急于加载关联,我将生成大量的单一查询.并做

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

看起来有点浪费.

wup*_*tah 5

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

 @person.flights.scoped(:include => :plane)
Run Code Online (Sandbox Code Playgroud)

在Rails 3中,你可以使用Rails 3方式:

 @person.flights.include(:plane)
Run Code Online (Sandbox Code Playgroud)

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

 has_many :flights, :include => :plane
Run Code Online (Sandbox Code Playgroud)

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

 default_scope :include => :plane
Run Code Online (Sandbox Code Playgroud)