2011-06-29 1 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-ifiedの前に内部的にハッシュにコンパイルされていると確信しているので、エンコード/デコードの余分なラウンドを何もする必要はありません。

+0

@Jeremy Heiler、私は上記の方法を言及します。 'to_json'のような引数はありません。アソシエーションとオプションによって提供される他のすばらしさを含めることをはるかに難しくします。 –

+0

うわー。ごめんなさい。私は半分眠っていなければならない。 – Jeremy

答えて

1

Rails 2.3ではas_jsonを使用できます。

as_jsonコールはこの状況で非常に役に立ちます。それは属性を取ることができ、ハッシュを返しますが、ネストされたオブジェクトを含め始めると少し奇妙です。具体的には、現在のオブジェクトのキーはすべて文字列であり、ネストされたオブジェクトのハンドルのキーはシンボルです。

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

のRails 3.0では、使用することができますようになりhashオブジェクトへ

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

とアクセス:

だから、あなたの例のために、あなたの呼び出しは、のようになりますserializable_hash

v2.3 as_json機能がに移動されました方法。上記と同じように動作します(v2.3 as_jsonメソッドがv3.0 serializable_hashメソッドに移動したことを伝えるソースコードを参照)。

0

オブジェクト+オブジェクトの配列を含む単純なハッシュを作成するために...しかし、あなたは、単に行うことができ、配列のためにハード:

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

あなたがこれを行うことができます:

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

ああ、より良い、私はあなたが実際に内部to_json

@bookshelf.as_json :include => :books 
によって呼び出され as_jsonを使用してハッシュを取得することができます信じ
関連する問題