Подтвердить что ты не робот

Определение значений полей хеш-мангоида

Я использую 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.

4b9b3361

Ответ 1

Вещь с полем Hash - она ​​может быть динамической, насколько вам хочется. Поэтому, чтобы предотвратить загрязнение вашей схемы БД непреднамеренными полями, вызванными ошибками в вашем коде, эта функция по умолчанию отключена.

Нет, вы не застряли с помощью двухэтапных обновлений для ваших хэшей вообще!

[], [] = являются ярлыками для read_attribute() и write_attribute() и должны использоваться, если вы не включаете Mongoid::Attributes::Dynamic. Если вы попытаетесь использовать $set без включения динамических атрибутов, вы получите ошибку no-method, потому что она не видит ваши динамические атрибуты в качестве определенных атрибутов.

Если вы прочитаете источник Mongoid:: Attributes:: Dynamic, то вы обнаружите, что это необходимо для добавления динамических атрибутов.

Чтобы обновить значения, включив Mongoid::Attributes::Dynamic, вам необходимо выполнить следующие действия:

thing = Thing.first
thing.set("info.endDate" => Time.now)
thing.reload # This will update the current variable 

В противном случае, если вам нужно, вы можете легко пропустить это и выполнить обновление значения с помощью двухэтапного метода

Я надеюсь, что это проливает свет на ваш запрос.

Источник:

Rails mongoid dynamic fields - нет ошибки метода

Динамические атрибуты с Rails и Mongoid

Ответ 2

Я думаю, что вы передаете параметр неправильно. Заменить символ стрелки запятой

Вы можете изменить это, и оно будет работать

thing.set("info.endDate", Time.now)