модуль ActiveRecord::Encryption::ExtendedDeterministicQueries
Автоматически расширяет зашифрованные аргументы для поддержки запросов как к зашифрованным, так и к незашифрованным данным
Active Record Encryption поддерживает запросы к базе данных с использованием детерминированных атрибутов. Например:
Contact.find_by(email_address: "jorge@hey.com")
Значение «jorge@hey.com» будет автоматически зашифровано для выполнения запроса. Но есть проблема, когда данные шифруются. Это не сработает. В это время эти запросы должны быть:
Contact.find_by(email_address: [ "jorge@hey.com", "<encrypted jorge@hey.com>" ])
Это исправляет ActiveRecord, чтобы автоматически поддерживать это. Это решает обе проблемы:
-
ActiveRecord::Base: используется в +Contact.find_by_email_address(…)+
-
ActiveRecord::Relation: используется в +Contact.internal.find_by_email_address(…)+
ActiveRecord::Base полагается на ActiveRecord::Relation (ActiveRecord::QueryMethods), но кэширует некоторые подготовленные запросы. Вот почему нам нужно перехватить ActiveRecord::Base как только он будет вызван (чтобы соответствующий подготовленный запрос был кэширован).
При изменении этого файла выполняйте тесты производительности в test/performance/extended_deterministic_queries_performance_test.rb для
make sure performance overhead is acceptable.
В будущих итерациях мы расширим это, чтобы поддерживать предыдущие версии «контекста шифрования»
@TODO Экспериментальная функция. Поддержка всех типов запросов ожидается @TODO Он не должен ничего исправлять, если это не нужно (нет предыдущих схем или нет поддержки предыдущих схем шифрования)
Публичные методы класса
# File activerecord/lib/active_record/encryption/extended_deterministic_queries.rb, line 34 def self.install_support ActiveRecord::Relation.prepend(RelationQueries) ActiveRecord::Base.include(CoreQueries) ActiveRecord::Encryption::EncryptedAttributeType.prepend(ExtendedEncryptableType) Arel::Nodes::HomogeneousIn.prepend(InWithAdditionalValues) end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.