如果我想急切地在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}}
)
上面没有显示'外观'(急切加载的连接记录)......我如何一起做这两个?非常感谢!
答案 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