Merge pull request #43263 from bnjamin/filter-virtual-columns

Filter virtual columns from the attribute names
This commit is contained in:
Rafael França 2021-09-20 17:28:45 -04:00 committed by GitHub
commit 6d3aedbbf2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 4 deletions

View File

@ -387,20 +387,22 @@ module ActiveRecord
attribute_names.index_with { |name| @attributes[name] }
end
# Filters the primary keys and readonly attributes from the attribute names.
# Filters the primary keys, readonly attributes and virtual columns from the attribute names.
def attributes_for_update(attribute_names)
attribute_names &= self.class.column_names
attribute_names.delete_if do |name|
self.class.readonly_attribute?(name)
self.class.readonly_attribute?(name) ||
column_for_attribute(name).virtual?
end
end
# Filters out the primary keys, from the attribute names, when the primary
# Filters out the virtual columns and also primary keys, from the attribute names, when the primary
# key is to be generated (e.g. the id attribute has no value).
def attributes_for_create(attribute_names)
attribute_names &= self.class.column_names
attribute_names.delete_if do |name|
pk_attribute?(name) && id.nil?
(pk_attribute?(name) && id.nil?) ||
column_for_attribute(name).virtual?
end
end

View File

@ -87,6 +87,10 @@ module ActiveRecord
comment.hash
end
def virtual?
false
end
private
def deduplicated
@name = -name

View File

@ -23,6 +23,16 @@ if ActiveRecord::Base.connection.supports_virtual_columns?
VirtualColumn.create(name: "Rails")
end
def test_virtual_column_with_full_inserts
partial_inserts_was = VirtualColumn.partial_inserts
VirtualColumn.partial_inserts = false
assert_nothing_raised do
VirtualColumn.create!(name: "Rails")
end
ensure
VirtualColumn.partial_inserts = partial_inserts_was
end
def teardown
@connection.drop_table :virtual_columns, if_exists: true
VirtualColumn.reset_column_information