Я использую Mongoid в проекте Rails (оба 4.0.x), и у меня есть документ с хэш-полем, в котором хранятся некоторые данные без схемы.
class Thing
field :name, type: String
field :mass, type: Integer
field :info, type: Hash
end
С помощью этой настройки я могу запросить, скажем, вещи, у которых есть ключ :endDate
, например:
Thing.where("info.endDate"=>{'$exists'=>true})
И это все хорошо и удобно. Использование хэш-поля для этого поля :info
приятно, потому что то, что я хочу сохранить, не имеет фиксированной схемы и варьируется от одной вещи к другой.
Хорошо, но я не могу использовать тот же синтаксис точки с парами ключ/значение $set
в хеше :info
. [1]
thing.set("info.endDate"=>Time.now)
Вызывает ошибку a Mongoid::Errors::UnknownAttribute
.
Он говорит мне, что мне нужно включить Mongoid::Attributes::Dynamic
в мою модель, чтобы это сделать, но это мне не кажется правильным. Точка типа хэш-поля, похоже, позволяет вам работать с данными, которые не имеют фиксированной схемы. Кажется, мне не нужно включать специальный модуль "динамических атрибутов" для использования хеш-полей.
Итак, сейчас я обновляю значения, используя обычный старый синтаксис []
, а затем вызываю save
в модели, например:
thing.info[:endDate] = Time.now
thing.save
Но часто случается, что было бы лучше всего $set
значение. Есть ли другой синтаксис для установки значений полей хэша? Я ошибаюсь в отношении вышеупомянутого сообщения об ошибке, а динамические атрибуты ошибочны? Я застрял, делаю обновление на два шага для хэш-полей?
[1], по общему признанию, я недавно перешел из mongomapper, и поэтому мои ожидания в отношении этого синтаксиса частично заданы тем, что он смог сделать это ранее в mongomapper.