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

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] } attribute_names.index_with { |name| @attributes[name] }
end 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) def attributes_for_update(attribute_names)
attribute_names &= self.class.column_names attribute_names &= self.class.column_names
attribute_names.delete_if do |name| attribute_names.delete_if do |name|
self.class.readonly_attribute?(name) self.class.readonly_attribute?(name) ||
column_for_attribute(name).virtual?
end end
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). # key is to be generated (e.g. the id attribute has no value).
def attributes_for_create(attribute_names) def attributes_for_create(attribute_names)
attribute_names &= self.class.column_names attribute_names &= self.class.column_names
attribute_names.delete_if do |name| attribute_names.delete_if do |name|
pk_attribute?(name) && id.nil? (pk_attribute?(name) && id.nil?) ||
column_for_attribute(name).virtual?
end end
end end

View file

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

View file

@ -23,6 +23,16 @@ if ActiveRecord::Base.connection.supports_virtual_columns?
VirtualColumn.create(name: "Rails") VirtualColumn.create(name: "Rails")
end 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 def teardown
@connection.drop_table :virtual_columns, if_exists: true @connection.drop_table :virtual_columns, if_exists: true
VirtualColumn.reset_column_information VirtualColumn.reset_column_information