Search code examples
ruby-on-railsrubypostgresqlrails-migrations

create rails migration for PostgreSQL GENERATED ALWAYS AS column


How to create rails migration for auto calculated columns like below.

    a_column integer,
    b_column integer,
    total1 integer GENERATED ALWAYS AS (a_column+b_column) stored,
    total2 integer GENERATED ALWAYS AS (a_column-b_column) stored,
    total3 integer GENERATED ALWAYS AS (a_column/b_column) stored
); 

I don't want to do using Models, because I want to use same table from another system having different technology.


Solution

  • You can use pure SQL in migration

    def up
      execute <<~SQL
        CREATE TABLE table_name (
          a_column integer,
          b_column integer,
          total1 integer GENERATED ALWAYS AS (a_column+b_column) stored,
          total2 integer GENERATED ALWAYS AS (a_column-b_column) stored,
          total3 integer GENERATED ALWAYS AS (a_column/b_column) stored
        );
      SQL
    end
    
    def down
      drop_table :table_name
    end
    

    When using such migrations, in order for the database schema to be correct, you need to use SQL dump type (default type is Ruby). To setup this setting add line to your config/application.rb

    config.active_record.schema_format = :sql
    

    After that schema will be saved to db/structure.sql

    Please read more