Rails 2.3: нужно что-то вроде ActiveRecord # to_json, которое возвращает хэш ruby - PullRequest
2 голосов
/ 29 июня 2011

Скажем, Bookshelf has_many :books. Я могу выбросить книжную полку в json, включая связанные с ней книги, например:

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

Но я хочу вместо этого простой рубиновый хеш. Я пробовал #attributes, но это, похоже, не требует никаких аргументов. И я пробовал #to_hash, но этот метод не на ActiveRecord::Base.

Я знаю, что мог бы сделать это:

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

Но это похоже на огромную и ужасную производительность. Я уверен, что он скомпилирован внутри хэша до его JSON-ified, поэтому я не хочу делать дополнительный раунд кодирования / декодирования без причины.

Ответы [ 3 ]

1 голос
/ 30 июня 2011

В 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 голосов
/ 29 июня 2011

Вы можете сделать это:

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

о, даже лучше, я верю, что вы можете получить хеш, используя as_json, который фактически внутренне вызывается как to_json

@bookshelf.as_json :include => :books
0 голосов
/ 29 июня 2011

Трудно создать простой хеш, содержащий объект + массив объектов ... но для массива вы можете просто сделать:

@bookshelf.books.map(&:attributes)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...