2012-04-26 88 views
10

我遇到了一個問題,我正在使用as_json方法,以及如何有效地返回JSON對象它的belongs_to對象也是JSON,其中belongs_to對象具有自己的belongs_to對象。代碼可能會更好地解釋它。Rails as_json問題 - 如何高效地包含嵌套對象?

的未工作方式

Alert類

class Alert < ActiveRecord::Base 
    belongs_to :message 
    # for json rendering 
    def as_json(options={}) 
     super(:include => :message) 
    end 
end 

消息類

def as_json(options={}) 
    super(methods: [:timestamp, :num_photos, :first_photo_url, :tag_names], 
      include: { camera: { only: [:id, :name] }, 
         position: { only: [:id, :name, :address, :default_threat_level ]}, 
         images: { only: [:id, :photo_url, :is_hidden]} }) 
    end 

這個首次設立的問題是,當我有提醒對象並致電

alert.as_json() 

我得到的所有來自警報的屬性和所有從郵件的屬性,但沒有從郵件,我想,像攝像頭,位置等

這裏的其他屬性的的「這是工作,但可能不合適的設計方法」

Alert類

class Alert < ActiveRecord::Base 

    belongs_to :message 

    # for json rendering 
    def as_json(options={}) 
     super().merge(:message => message.as_json) 
    end 
end 

消息類

# for json rendering 
    def as_json(options={}) 
    super(methods: [:timestamp, :num_photos, :first_photo_url, :tag_names]) 
      .merge(:camera => camera.as_json) 
      .merge(:position => position.as_json) 
      .merge(:images => images.as_json) 
    end 

在這第二個設置中,我得到了所有消息的嵌套屬性,就像我想要的。

我的問題,我錯過了一些Rails公約來正確地做到這一點?這似乎有/應該是一個更簡單的方法。

回答

3

您正在使用哪個版本的Rails?這是舊版Rails中的一個已知錯誤,據推測,這個錯誤是由this pull request修復的。你的語法對我來說很合適,所以也許這是你的問題?

順便說一句,您可能還想結算Jose Valim(Rails核心成員)的新active_model_serializers。它至少可以讓你以更優雅的方式解決你的問題。

+0

好吧,他們看起來像他們用拉請求修復它,但從來沒有把它拉到一個版本。感謝您的鏈接,它解決了一些問題。 – bluedevil2k 2012-04-26 21:04:05

+1

爲了記錄,我從PR獲得的是:1)嘗試使用特定的gem作爲json api(我喜歡Active Model Serializer)2)如果你不想/不能這樣做,可以重寫'serialized_hash而不是所有模型中的'as_json'。用'serialized_hash'替換'as_json'。您的模型將正確呈現包含的依賴關係。 – kikito 2013-03-10 11:35:56

+0

感謝kikito,輕微的更正,它是'serializable_hash' – trans1t 2015-08-23 06:08:17

1

我建議你看一看Rabl的(代表Ruby的API生成器語言)的寶石(railscastgithub)。它爲您提供了一個DSL,用於定義模板中的JSON(也是XML)響應的結構(如Haml或CoffeeScript)。它也支持partials。

7

對我來說最好的答案是使用serializable_hash。 @kikito在他的評論中提到了這一點,但是有一個錯誤,導致它無法正常工作。這不是,它是serializable_hash

字面上找到+替換as_jsonserializable_hash,這個錯誤消失。 (它在今天的Rails 4.0.2中仍然沒有修復)。稍後您可以更輕鬆地實現XML API(有些人仍然使用這些!)。

+1

謝謝,爲我工作 – toby 2014-04-30 13:48:03