0

如果我想在 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}}
)

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

4

3 回答 3

2

您可能将“急切加载”一词混为一谈。正如之前的答案所提到的,您需要在关联上使用它才能急切加载它。但是,当您:include在 to_json 调用中使用时,无论是否急切,您仍然会得到相同的结果。

但是要回答您的问题,对于 to_json 方法既包括外观又包括 funky_calculation 您可以将其结合起来: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]
)
于 2012-09-25T06:51:08.717 回答
1

includes您可以在 has_many 关联之后使用预加载

@photos = @event.photos.includes(:appearances => [:person]).to_json
于 2012-09-25T06:39:29.877 回答
1

您可能想尝试在照片上使用joins()includes(),而不是作为to_json().

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

于 2012-09-25T06:39:47.797 回答