Sha256: 62700a9d1d6eb6768da82f0361a32019562045dfe21f561e0a40eeabaa2cf47d

Contents?: true

Size: 1.9 KB

Versions: 4

Compression:

Stored size: 1.9 KB

Contents

require 'ardb'

module Ardb

  module MigrationHelpers
    module_function

    def foreign_key(from_table, from_column, to_table, options={})
      fk = ForeignKey.new(from_table, from_column, to_table, options)
      execute(fk.add_sql)
    end

    def drop_foreign_key(*args)
      from_table, from_column = args[0..1]
      options = args.last.kind_of?(Hash) ? args.last : {}
      fk = ForeignKey.new(from_table, from_column, nil, options)
      execute(fk.drop_sql)
    end

    def remove_column_with_fk(table, column)
      drop_foreign_key(table, column)
      remove_column(table, column)
    end

    class ForeignKey
      attr_reader :from_table, :from_column, :to_table, :to_column, :name, :adapter

      def initialize(from_table, from_column, to_table, options=nil)
        options ||= {}
        @from_table  = from_table.to_s
        @from_column = from_column.to_s
        @to_table    = to_table.to_s
        @to_column   = (options[:to_column] || 'id').to_s
        @name        = (options[:name] || "fk_#{@from_table}_#{@from_column}").to_s
        @adapter     = Ardb::Adapter.new(Ardb.config)
      end

      def add_sql
        apply_data(@adapter.foreign_key_add_sql)
      end

      def drop_sql
        apply_data(@adapter.foreign_key_drop_sql)
      end

      private

      def apply_data(template_sql)
        template_sql.
          gsub(':from_table',  @from_table).
          gsub(':from_column', @from_column).
          gsub(':to_table',    @to_table).
          gsub(':to_column',   @to_column).
          gsub(':name',        @name)
      end
    end

    # This file will setup the AR migration command recorder for being able to
    # change our stuff, require it in an initializer

    module RecorderMixin

      def foreign_key(*args)
        record(:foreign_key, args)
      end

      protected

      def invert_foreign_key(args)
        [ :drop_foreign_key, args ]
      end

    end

  end

end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
ardb-0.28.3 lib/ardb/migration_helpers.rb
ardb-0.28.2 lib/ardb/migration_helpers.rb
ardb-0.28.1 lib/ardb/migration_helpers.rb
ardb-0.28.0 lib/ardb/migration_helpers.rb