как удалить атрибуты из Mongoid модели, то есть не просто обнулить их значения - PullRequest
6 голосов
/ 05 февраля 2012

Я экспериментировал с полиморфной ассоциацией в Mongoid

class Group
    include Mongoid::Document
    belongs_to :groupable, polymorphic: true
end

class Album
    include Mongoid::Document
    has_many :groups, as: groupable
end

тогда я решил против этого. Так что я удалил все эти строки принадлежащие выше: has_many и has_many. Тем не менее, в консоли всякий раз, когда я получаю запись группы, с которой я экспериментировал, он по-прежнему имеет атрибут groupable_type. Я знаю, что remove_attribute обнуляет атрибут, но не удаляет его (звучит немного как JavaScript). Как я могу фактически удалить этот атрибут из базы данных из Mongoid?

Ответы [ 4 ]

13 голосов
/ 05 февраля 2012

Вы можете сделать это:

Group.collection.update({},
                        {'$unset' => {:groupable_type => 1}},
                        :multi => true)
3 голосов
/ 30 октября 2015

Начиная с версии 5.0.0 Mongoid, гем переключился с использования Moped на использование «официального драйвера ruby ​​MongoDB», который имеет другой синтаксис для обновлений. Справка: https://docs.mongodb.org/ecosystem/drivers/ruby/

Документация по методам сбора находится здесь: http://api.mongodb.org/ruby/current/Mongo/Collection.html

Есть 2 метода: «обновить» и «обновить_меня». Вы можете использовать update_many вместо указания опции 'multi' для обновления всех документов.

Пример использования для случая OP:

Group.collection.update_many({}, {'$unset' => {'groupable_type' => true}})

Обратите внимание, что вы можете удалить встроенные документы, используя точечную запись:

Group.collection.update_many({}, {'$unset' => {'embedded_doc.groupable_type' => true}})

Обратите внимание, что MongoDB плохо поддерживает удаление / обновление полей в массиве. Посмотрите эту тему для информации и обходных путей: https://jira.mongodb.org/browse/SERVER-1243.

0 голосов
/ 26 февраля 2019

Для одного экземпляра возможно (по крайней мере, в последних версиях Mongoid) напрямую использовать unset в вашем экземпляре

Group.first.unset('groupable_type')
0 голосов
/ 02 мая 2014

Я заметил, что в Moped 2.0.0.rc1 метод обновления пропал в коллекции, но это работает;

Group.collection.find().update(
                    {'$unset' => {:groupable_type => 1}},
                    :multi => true)     
...