module Jobshop::Helpers::Migration

Public Instance Methods

create_table_with_auditing(table_name, *args) { |t| ... } click to toggle source
# File lib/jobshop/helpers/migration.rb, line 43
      def create_table_with_auditing(table_name, *args) # rubocop: disable Metrics/MethodLength
        options = args.extract_options!
        primary_key_columns = options.delete(:primary_key)
        id_column = options.delete(:id)
        id_column = :uuid if id_column == nil

        if primary_key_columns.is_a?(Hash)
          primary_key = []
          types = []

          primary_key_columns.each do |name, type|
            primary_key.push(name)
            types.push(type)
          end
        else
          primary_key = Array(primary_key_columns)
          types = Array.new(primary_key.count, :uuid)
        end

        primary_key_hash = Hash[primary_key.zip(types)]
        auditing_table_name = table_name.to_s.concat("_history")
        trigger_name = table_name.to_s.concat("_trigger")

        # Create primary table to hold presently valid data
        create_table table_name, id: id_column do |t|
          if primary_key_columns
            primary_key_hash.each do |name, type|
              next if :id == name
              t.send(type, name, null: false)
            end

            t.index primary_key, unique: true,
              name: :"index_jobshop_#{table_name}"
          end

          yield t
        end

        execute <<~SQL
          ALTER TABLE #{table_name}
            ADD COLUMN sys_period tstzrange NOT NULL
            DEFAULT tstzrange(current_timestamp, NULL);

          CREATE TABLE #{auditing_table_name} (LIKE #{table_name});

          CREATE TRIGGER #{trigger_name}
            BEFORE INSERT OR UPDATE OR DELETE ON #{table_name}
              FOR EACH ROW EXECUTE PROCEDURE
                versioning('sys_period', '#{auditing_table_name}', true);
        SQL
      end
fk_organization(table_name) click to toggle source
# File lib/jobshop/helpers/migration.rb, line 6
def fk_organization(table_name)
  foreign_key table_name, :jobshop_organizations, { organization_id: :id }
end
foreign_key(table_name, reference_table, columns, options = "") click to toggle source
# File lib/jobshop/helpers/migration.rb, line 19
      def foreign_key(table_name, reference_table, columns, options = "")
        if columns.is_a?(Hash)
          keys = []
          references = []

          columns.each do |k, v|
            keys.push(k)
            references.push(v)
          end
        else
          keys = references = Array(columns)
        end

        constraint_name = "fk_#{table_name}_#{keys.join('_')}"

        execute <<~SQL
          ALTER TABLE #{table_name}
            ADD CONSTRAINT #{constraint_name}
              FOREIGN KEY (#{keys.join(", ")})
              REFERENCES #{reference_table} (#{references.join(", ")})
              #{options};
        SQL
      end
nested_set_attrs(table_name) click to toggle source
# File lib/jobshop/helpers/migration.rb, line 10
def nested_set_attrs(table_name)
  reference_column = table_name.sub(/jobshop_/, "").singularize + "_id"
  add_column table_name, :parent_id, :uuid
  add_column table_name, :lft, :uuid
  add_column table_name, :rgt, :uuid

  foreign_key table_name, table_name, { parent_id: reference_column }
end