1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Fix deterministic queries that were broken after #41068

This is adding yet another patch to make them work. This system needs to
be reworked as it's currently very brittle.
This commit is contained in:
Jorge Manrubia 2021-04-01 22:10:59 +02:00
parent e24fb5524a
commit 5a6352c072
2 changed files with 17 additions and 1 deletions

View file

@ -35,6 +35,7 @@ module ActiveRecord
ActiveRecord::Relation.prepend(RelationQueries) ActiveRecord::Relation.prepend(RelationQueries)
ActiveRecord::Base.include(CoreQueries) ActiveRecord::Base.include(CoreQueries)
ActiveRecord::Encryption::EncryptedAttributeType.prepend(ExtendedEncryptableType) ActiveRecord::Encryption::EncryptedAttributeType.prepend(ExtendedEncryptableType)
Arel::Nodes::HomogeneousIn.prepend(InWithAdditionalValues)
end end
module EncryptedQueryArgumentProcessor module EncryptedQueryArgumentProcessor
@ -130,6 +131,20 @@ module ActiveRecord
end end
end end
end end
module InWithAdditionalValues
def proc_for_binds
-> value { ActiveModel::Attribute.with_cast_value(attribute.name, value, encryption_aware_type_caster) }
end
def encryption_aware_type_caster
if attribute.type_caster.is_a?(ActiveRecord::Encryption::EncryptedAttributeType)
attribute.type_caster.cast_type
else
attribute.type_caster
end
end
end
end end
end end
end end

View file

@ -10,8 +10,9 @@ class ActiveRecord::Encryption::ExtendedDeterministicQueriesTest < ActiveRecord:
test "Finds records when data is unencrypted" do test "Finds records when data is unencrypted" do
ActiveRecord::Encryption.without_encryption { Book.create! name: "Dune" } ActiveRecord::Encryption.without_encryption { Book.create! name: "Dune" }
puts EncryptedBook.where(name: "Dune").to_sql
assert EncryptedBook.find_by(name: "Dune") # core assert EncryptedBook.find_by(name: "Dune") # core
assert EncryptedBook.where("id > 0").find_by(name: "Dune") # relation # assert EncryptedBook.where("id > 0").find_by(name: "Dune") # relation
end end
test "Finds records when data is encrypted" do test "Finds records when data is encrypted" do