2013-02-21 2 views
4

В Mongoid 3.0.21, как получить все атрибуты модели как обычный Ruby Hash?Извлечение атрибутов `Moped :: BSON :: Document` в Ruby hash

Вызов либо #attributes, либо #raw_attributesMoped::BSON::Document. Хотя он фактически расширяет Hash, несколько хеш-методов не работают должным образом. В частности, #except возвращает немодифицированный self, а не хеш с заданными клавишами, снятыми.

Обновление: Moped::BSON::Document Правильно наследует поведение Hash. Я пытался называть атрибуты символами, а не строками, поэтому #except не работал. В ближайшее время: except('pictures'), а не except(:pictures).

ответ

11
Hash[e.attributes] 

где е ваша модель экземпляра

+0

Спасибо! Я знал, что должно быть какое-то изящное решение! – skalee

+0

Возможно, вы захотите использовать ActiveSupport :: HashWithIndifferentAccess вместо простого хэша, чтобы иметь возможность доступа к значениям с использованием как строк, так и символов – cthulhu

+0

Я уверен, может, спасибо. Но основная проблема заключалась в том, что я вообще не мог обращаться к именам атрибутов, потому что они индексируются строками, а не символами. Это отличается от того, к которому я привык (ActiveRecord). – skalee

4

Я извиняюсь за натыкаясь что-то такое старое, но я хотел бы оставить это здесь для себя и всех будущих людей, которые работают в этом же номере. Я использую Mongoid ORM для Rails, который использует Moped внутри себя для взаимодействия с MongoDB.

Этот драгоценный камень теперь спас меня от часов, часов и часов, превратив их в Hash или HashWithIndifferentAccess: https://github.com/mindscratch/mongoid-indifferent-access.

По существу, у него есть какой-то предварительный крючок, который автоматически преобразует все документы, поступающие от MongoDB, чтобы ввести HashWithIndifferentAccess.

Не ищите точки на этом. Просто хотел оставить это здесь, потому что это лучший результат Google для этой проблемы, и это спасло меня от сумасшествия.

Смежные вопросы