Rails 2.3:需要像ActiveRecord#to_json那样返回ruby哈希

时间:2011-06-29 18:33:14

标签: ruby-on-rails ruby activerecord

让我们说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之前被编译为内部哈希,所以我不想无缘无故地进行额外的编码/解码。

3 个答案:

答案 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}}