Mongoid удалить несохраненные вложенные документы

Вы не можете сделать это с помощью adb на своем устройстве. Ваш adb вне устройства, я имею в виду на вашем компьютере, подключенном к usb, может изменить его с передачей разрешения перед изменением языка.

На вашем устройстве напрямую требуется корневое устройство.

0
задан eriese 16 January 2019 в 19:40
поделиться

1 ответ

В итоге я сделал патч обезьяны, который переопределяет классовые методы Mongoid embeds_many и embeds_one, чтобы также определить метод экземпляра для очистки несохраненных документов для этого отношения. Мне показалось, что это самый простой способ, потому что это очень мало кода, и это означает, что мне не нужно помнить, чтобы включать его местами.

# config/initializers/patches/dirty_tracking_embedded.rb
module DirtyTrackingEmbedded
    # override the embedding methods to also make dirty-tracking
    def embeds_many(name, options= {}, &block)
        define_method "clear_unsaved_#{name}" do
            new_list = send(name).select(&:persisted?)
            send(name.to_s + "=", new_list)
        end
        super
    end

    def embeds_one(name, options={}, &block)
        define_method "clear_unsaved_#{name}" do
            send(name.to_s + "=", nil) unless send(name).persisted?
        end
        super
    end
end

module Mongoid
    module Association
        module Macros
            module ClassMethods
                prepend DirtyTrackingEmbedded
            end
        end
    end
end

Затем в моем контроллере я использовал after_action:

# app/controllers/relationships_controller.rb
class RelationshipsController < ApplicationController
    after_action :clear_unsaved, only: [:new]

    def new
        @relationship = current_user.relationships.new(friend_id: params[:fid])
        @relationship.validate
    end

    private
    def clear_unsaved
        current_user.clear_unsaved_relationships
    end
end

Другие возможности

Другой патч обезьяны

Вы можете патчить обезьяну [ 115] методы в Mongoid::Association::Embedded::EmbedsMany и Mongoid::Association::Embedded::EmbedsOne , чтобы включить настройку метода экземпляра для очистки несохраненных. Вы можете найти пример того, как монгоиды делают подобные вещи, посмотрев на Mongoid::Association::Accessors#self.define_ids_setter! . Я бы порекомендовал сделать ваше исправление с помощью prepend, как в решении, которое я использовал, чтобы вы могли наследовать остальную часть метода.

Патч и наследование Combo Monkey

Mongoid выбирает, какой класс использовать для создания ассоциации из константы с именем MACRO_MAPPING в Mongoid::Association , так что вы можете создавать классы, которые наследуются от EmbedsMany и EmbedsOne просто переопределяют setup_instance_methods!, чтобы добавить необходимый метод экземпляра, тогда вам нужно будет только обезьяна заплатить MACRO_MAPPING для сопоставления с вашими новыми классами.

Обеспокоенность

Если вы исправляете ошибки от обезьян, вы можете использовать код из моего модуля DirtyTrackingEmbedded, чтобы создать ActiveSupport::Concern, который делает то же самое. Вы захотите поместить переопределенные методы в блок class_methods, а затем просто убедитесь, что вы включили этот модуль после включения Mongoid::Document в любой класс модели, в котором вы хотите его использовать.

0
ответ дан eriese 16 January 2019 в 19:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: