让我们说Bookshelf has_many :books
。我可以把书架转到json,包括它的相关书籍:
@bookshelf.to_json :include => [:books]
但我想要一个简单的ruby哈希。我试过#attributes
,但似乎没有任何论据。我已尝试#to_hash
,但该方法不在ActiveRecord::Base
上。
我知道我可以这样做:
JSON.parse @bookshelf.to_json(:include => [:books])
但这感觉就像是巨大而丑陋的性能浪费。我确定它在JSON-ified之前被编译为内部哈希,所以我不想无缘无故地进行额外的编码/解码。
答案 0 :(得分: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
方法)。
答案 1 :(得分:0)
很难创建一个包含对象+对象数组的简单哈希...但是对于数组你可以这样做:
@bookshelf.books.map(&:attributes)
答案 2 :(得分:0)
你可以这样做:
@bookshelf.attributes.merge(:books => @bookshelf.books.map(&:attributes))
哦,甚至更好,我相信你可以使用as_json
来获取哈希,to_json
实际上是由内部调用@bookshelf.as_json :include => :books
{{1}}