2011-06-29 38 views
2

可以說Bookshelf has_many :books。我可以轉儲一個書架JSON,包括其相關的書籍是這樣的:Rails 2.3:需要像ActiveRecord#to_json那樣返回紅寶石散列

@bookshelf.to_json :include => [:books] 

但我想要一個簡單的紅寶石哈希來代替。我試過#attributes,但似乎沒有任何爭論。我試過#to_hash但該方法不適用於ActiveRecord::Base

我知道我可以做到這一點:

JSON.parse @bookshelf.to_json(:include => [:books]) 

但是,這感覺就像一個巨大而醜陋的性能浪費。我確定它在JSON之前在內部被編譯爲散列函數,所以我不想無緣無故地做一輪額外的編碼/解碼。

+0

@Jeremy Heiler,我提到了上面的方法。它不需要像'to_json'這樣的參數。使包含關聯和選項提供的所有其他可怕性變得更加困難。 –

+0

哇。抱歉。我一定是半睡着了。 – Jeremy

回答

1

在Rails 2.3中,您可以使用as_json

對於這種情況,as_json調用非常有幫助。它可以接受屬性並返回一個散列,但當你開始包括嵌套對象時,這些鍵有點奇怪。具體來說,當前對象的鍵都是字符串,而嵌套對象句柄的鍵是一個符號。

所以,你的榜樣,您的通話可能看起來是這樣的:

hash = @bookshelf.as_json(:include => {:author => {}, :books => {:include => :pages}})

並獲得了hash物體看起來像:

hash["bookshelf_color"] #=> "White" 
hash[:author]["name"] #=> "John Smith" 
hash[:books][:pages]["format"] #=> "8.5 inches x 5.5 inches" 

在Rails 3.0,您可以使用serializable_hash

該v2.3 as_json功能轉移到serializable_hash方法。它的工作方式與上述相同(查看源代碼,您可以將v2.3 as_json方法移至v3.0 serializable_hash方法)。

0

很難創建一個包含對象+對象的數組一個簡單的哈希......但對於數組,你可以簡單地做:

@bookshelf.books.map(&:attributes) 
0

你可以這樣做:

@bookshelf.attributes.merge(:books => @bookshelf.books.map(&:attributes)) 

哦,甚至更好,我相信你可以得到一個哈希使用as_json這實際上是由內部調用to_json

@bookshelf.as_json :include => :books