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:
commit
6d3aedbbf2
3 changed files with 20 additions and 4 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue