Я использую 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)
вызывает ошибку Mongoid::Errors::UnknownAttribute
.
Это говорит мне, что мне нужно включить Mongoid::Attributes::Dynamic
в мою модель, чтобы сделать это, но это не кажется прямо на меня. The point of the hash field type, похоже, позволит вам работать с данными, которые не имеют фиксированной схемы. Кажется, мне не нужно включать специальный модуль «динамических атрибутов» для использования хеш-полей.
Так прямо сейчас, я обновляю значение, используя обычный старый []
синтаксис, а затем вызвать save
на модели, например, так:
thing.info[:endDate] = Time.now
thing.save
Но много времени это случается, что было бы лучше, до $set
значение. Есть ли другой синтаксис для установки значений полей хэша? Я ошибаюсь в отношении вышеупомянутого сообщения об ошибке, а динамические атрибуты ошибочны? Я застрял, делаю обновление на два шага для хэш-полей?
[1] По правде говоря, я недавно перешел из mongomapper, и поэтому мои ожидания в отношении этого синтаксиса частично заданы тем, что он смог сделать это ранее в mongomapper.
Я думаю, что embeds_one, который будет определен как Mongoid :: Атрибуты :: Dynamic, будет работать для вас (никогда не испытанной этот подход) –
Я не Не требуется встроенный документ. Я хочу поле Hash, потому что данные, которые я храню, варьируются от документа к документу. И mongoid дает мне способ запросить конкретные пары ключей/значений внутри этого хэша. Я хотел бы иметь возможность обновлять пары ключ/значение в этом хэше, как легко, используя $ set. – Bee
Разве это не должно быть '.set (: info => {: endDate => Time.now}). Это было некоторое время с тех пор, как я работал с MongoDB. –