У меня есть следующий объект, который был создан
@post = Post.create(:name => 'test', :post_number => 20, :active => true)
Как только это будет сохранено, я хочу иметь возможность вернуть объект в хеш, например, выполнив что-то вроде:
@object.to_hash
Как это возможно изнутри рельсов?
ruby-on-rails
ruby
Бен Морган
источник
источник
.to_json
будет запрашивать БД, если модель не завершенаjoins
иselect
,Person.joins(:address).select("addresses.street, persons.name").find_by_id(id).attributes
вернется{ street: "", name: "" }
as_json
, он будет вызывать,serializable_hash
который, в свою очередь, будет вызыватьattributes
! Таким образом, ваш совет на самом деле добавляет два уровня сложностиattributes
, делая его еще дороже..as_json
будет сериализовать объект в рубиновый хэшВ самой последней версии Rails (хотя не могу сказать, какая именно), вы можете использовать
as_json
метод:Будет выводить:
Чтобы пойти немного дальше, вы можете переопределить этот метод, чтобы настроить способ отображения ваших атрибутов, выполнив что-то вроде этого:
Затем, с тем же экземпляром, что и выше, выведет:
Это, конечно, означает, что вы должны явно указать, какие атрибуты должны появляться.
Надеюсь это поможет.
РЕДАКТИРОВАТЬ :
Также вы можете проверить гем Hashifiable .
источник
as_json имеет очень гибкий способ конфигурировать сложный объект в соответствии с модельными отношениями
ПРИМЕР
Модельная кампания принадлежит магазину и имеет один список
У списка моделей есть много list_tasks, и у каждого из list_tasks есть много комментариев
Мы можем получить один JSON, который легко объединяет все эти данные.
Методы уведомления :: теги могут помочь вам прикрепить любой дополнительный объект, который не имеет отношения с другими. Вам просто нужно определить метод с тегами имен в модельной кампании . Этот метод должен возвращать все, что вам нужно (например, Tags.all)
Официальная документация для as_json
источник
to_
Вариант , кажется, работает почти точно так же , какas_
вариант, для цитируемого выхода за исключением. Единственное, что мне не понравилось, - это не сохранять порядок критериев фильтра. Вроде бы отсортировано по алфавиту. Я думал, что это связано с драгоценным камнем awesome_print, который есть в моей среде, но я не думаю, что это так.Вы можете получить атрибуты модельного объекта, возвращенного как хеш, используя либо
или
as_json
позволяет вам включать ассоциации и их атрибуты, а также указывать, какие атрибуты включать / исключать (см. документацию ). Однако, если вам нужны только атрибуты базового объекта, сравнительный анализ в моем приложении с ruby 2.2.3 и rails 4.2.2 демонстрирует, что этоattributes
требует вдвое меньше времени, чемas_json
.источник
Здесь есть несколько отличных предложений.
Думаю, стоит отметить, что модель ActiveRecord можно рассматривать как хеш-код:
Поэтому вместо генерации хеша атрибутов вы можете использовать сам объект в качестве хеша.
источник
Вы можете определенно использовать атрибуты для возврата всех атрибутов, но вы можете добавить метод экземпляра в Post, вызвать его «to_hash» и заставить его возвращать данные, которые вы хотите получить в хэше. Что-то вроде
источник
не уверен, что это то, что вам нужно, но попробуйте это в консоли ruby:
очевидно, он вернет вам хеш в консоли. если вы хотите вернуть хеш из метода - вместо «h» попробуйте использовать «return h.inspect», что-то похожее на:
источник
Мое решение:
источник
Ответ Свананда великолепен.
если вы используете FactoryGirl, вы можете использовать его
build
метод для генерации хеша атрибута без ключаid
. напримеристочник
Старый вопрос, но на него часто ссылаются ... Я думаю, что большинство людей используют другие методы, но есть
to_hash
метод, который должен быть правильно настроен. Вообще, pluck - лучший ответ после рельсов 4 ... отвечая на это главным образом потому, что мне пришлось искать группу, чтобы найти эту ветку или что-нибудь полезное, и предполагая, что другие сталкиваются с той же проблемой ...Примечание: не рекомендую это для всех, но крайние случаи!
Из рубина на рельсы api ... http://api.rubyonrails.org/classes/ActiveRecord/Result.html ...
источник