Вы не можете сделать это с помощью adb на своем устройстве. Ваш adb вне устройства, я имею в виду на вашем компьютере, подключенном к usb, может изменить его с передачей разрешения перед изменением языка.
На вашем устройстве напрямую требуется корневое устройство.
В итоге я сделал патч обезьяны, который переопределяет классовые методы 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
, как в решении, которое я использовал, чтобы вы могли наследовать остальную часть метода.
Mongoid выбирает, какой класс использовать для создания ассоциации из константы с именем MACRO_MAPPING
в Mongoid::Association
, так что вы можете создавать классы, которые наследуются от EmbedsMany
и EmbedsOne
просто переопределяют setup_instance_methods!
, чтобы добавить необходимый метод экземпляра, тогда вам нужно будет только обезьяна заплатить MACRO_MAPPING
для сопоставления с вашими новыми классами.
Если вы исправляете ошибки от обезьян, вы можете использовать код из моего модуля DirtyTrackingEmbedded
, чтобы создать ActiveSupport::Concern
, который делает то же самое. Вы захотите поместить переопределенные методы в блок class_methods
, а затем просто убедитесь, что вы включили этот модуль после включения Mongoid::Document
в любой класс модели, в котором вы хотите его использовать.