From 64fd666e161771ee30d3440bc4d3dd881019b39b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Stu=CC=88ben?= Date: Tue, 6 Apr 2021 19:04:50 +0200 Subject: [PATCH] Incorporate feedback --- activerecord/CHANGELOG.md | 2 +- .../connection_adapters/abstract/database_statements.rb | 2 +- .../active_record/connection_adapters/postgresql/column.rb | 5 ++++- .../test/cases/adapters/postgresql/virtual_column_test.rb | 4 ++++ activerecord/test/fixtures/virtual_columns.yml | 5 +++++ guides/source/active_record_postgresql.md | 2 +- 6 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 activerecord/test/fixtures/virtual_columns.yml diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 63fb74a991..e4a4667e71 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -6,7 +6,7 @@ ```ruby create_table :users do |t| t.string :name - t.virtual :name_upcased, type: :string, as: 'upper(name)' + t.virtual :name_upcased, type: :string, as: 'upper(name)', stored: true end ``` diff --git a/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb b/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb index 4a1541a91b..6c210b08b2 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb @@ -456,7 +456,7 @@ module ActiveRecord end def build_fixture_sql(fixtures, table_name) - columns = schema_cache.columns_hash(table_name) + columns = schema_cache.columns_hash(table_name).reject { |_, column| supports_virtual_columns? && column.virtual? } values_list = fixtures.map do |fixture| fixture = fixture.stringify_keys diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/column.rb b/activerecord/lib/active_record/connection_adapters/postgresql/column.rb index 911683f75d..c05788105a 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql/column.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql/column.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require "active_support/core_ext/object/blank" + module ActiveRecord module ConnectionAdapters module PostgreSQL @@ -17,7 +19,8 @@ module ActiveRecord end def virtual? - @generated == "s" + # We assume every generated column is virtual, no matter the concrete type + @generated.present? end def has_default? diff --git a/activerecord/test/cases/adapters/postgresql/virtual_column_test.rb b/activerecord/test/cases/adapters/postgresql/virtual_column_test.rb index b1becd24dc..fa6dcc51a6 100644 --- a/activerecord/test/cases/adapters/postgresql/virtual_column_test.rb +++ b/activerecord/test/cases/adapters/postgresql/virtual_column_test.rb @@ -69,5 +69,9 @@ if ActiveRecord::Base.connection.supports_virtual_columns? assert_match(/t\.virtual\s+"name_length",\s+type: :integer,\s+as: "length\(\(name\)::text\)", stored: true$/i, output) assert_match(/t\.virtual\s+"name_octet_length",\s+type: :integer,\s+as: "octet_length\(\(name\)::text\)", stored: true$/i, output) end + + def test_build_fixture_sql + ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT, :virtual_columns) + end end end diff --git a/activerecord/test/fixtures/virtual_columns.yml b/activerecord/test/fixtures/virtual_columns.yml new file mode 100644 index 0000000000..84f519bb14 --- /dev/null +++ b/activerecord/test/fixtures/virtual_columns.yml @@ -0,0 +1,5 @@ +one: + name: hello + +two: + name: world diff --git a/guides/source/active_record_postgresql.md b/guides/source/active_record_postgresql.md index 19db5ec0c5..c6d1ad6963 100644 --- a/guides/source/active_record_postgresql.md +++ b/guides/source/active_record_postgresql.md @@ -512,7 +512,7 @@ NOTE: Generated columns are supported since version 12.0 of PostgreSQL. # db/migrate/20131220144913_create_users.rb create_table :users do |t| t.string :name - t.virtual :name_upcased, type: :string, as: 'upper(name)' + t.virtual :name_upcased, type: :string, as: 'upper(name)', stored: true end # app/models/user.rb