2012-09-25 96 views
0

如果我想在rails中加載一個集合並將其呈現在json中,我將不得不這樣做。急於加載和導軌地圖3

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

上面不顯示'外表「(急切加載的加入記錄)......我如何將這兩者結合在一起?非常感謝!

回答

2

您可能有術語「預先加載」混了一點點。正如前面的答案所提到的,你需要在關聯上使用它來加載。但是,當您在to_json調用中使用:include時,無論是否渴望,您仍然會得到相同的結果。

但要回答你的問題,to_json方法既包括外觀和funky_calculation,也可以將其與:methods結合使用。試着這樣說:

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

如果你想要更高的性能(預先加載),然後使用包括在協會以及:

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

這增加了funky_calculation作爲一個屬性,但是如果我想要映射記錄本身?例如,我有一個屬性叫做縣,它是由座標派生的,我如何將項目本身添加到項目本身而不是funky_calculation.county? – jdkealy

+0

那麼,如果它是一個記錄,那麼你可以把它放在:include hash和外觀一起,但是如果你想讓縣在照片中顯示爲屬性,那麼只需在Photo類中創建一個方法,調用funky_calculation.county然後將該方法放在:methods數組中。 – DanneManne

1

你可以貪婪加載的has_many關聯後使用includes

@photos = @event.photos.includes(:appearances => [:person]).to_json