渴望加载并在轨道3中映射

时间:2012-09-25 04:35:51

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

如果我想急切地在rails中加载一个集合并在json中渲染它,我就必须做这样的事情。

@photos = @event.photos.to_json(:include => 
  {:appearances => {:include => :person}}
)

如果我想要映射此集合怎么办?正如你所看到的,它不再是一个集合,而是一个json字符串。在这个必要的急切加载之前,我正在做以下事情:

@photos = @event.photos.map{|photo| 
  photo['some_funky_stuff'] = photo.funky_calculation
  photo 
}

但是,我似乎无法一起完成这两件事:

@event.photos.map{|photo| 
  photo['some_funky_stuff'] = photo.funky_calculation
  photo 
}.to_json(:include => 
  {:appearances => {:include => :person}}
)

上面没有显示'外观'(急切加载的连接记录)......我如何一起做这两个?非常感谢!

3 个答案:

答案 0 :(得分:2)

你可能会将“渴望加载”一词混淆一点。正如之前的答案所提到的那样,你需要在关联上使用它来加载它。但是,当你在to_json调用中使用:include时,无论是否渴望,你仍然会得到相同的结果。

但是要回答你的问题,对于包含外观和funky_calculation的to_json方法,你可以将它与:methods结合起来。试试这样:

@photos = @event.photos.to_json(
  :include => {:appearances => {:include => :person}},
  :methods => [: funky_calculation]
)

如果你想提高性能(急切加载),那么也要在关联上使用include:

@photos = @event.photos.includes(:appearances => :person).to_json(
  :include => {:appearances => {:include => :person}},
  :methods => [: funky_calculation]
)

答案 1 :(得分:1)

您可以在has_many association

之后使用includes急切加载
@photos = @event.photos.includes(:appearances => [:person]).to_json

答案 2 :(得分:1)

您可能想尝试在照片上使用joins()includes(),而不是to_json()选项。

http://guides.rubyonrails.org/active_record_querying.html#using-array-hash-of-named-associations