# Copyright (c) 2011 Arthur Shagall # Released under the MIT license. See LICENSE for details. # Extensions to the migrations DSL module PowerEnum::Schema # Patches AbstractAdapter with {PowerEnum::Schema::AbstractAdapter} module SchemaStatements def self.included(base) # :nodoc: base::AbstractAdapter.class_eval do include PowerEnum::Schema::AbstractAdapter end end end # Implementation of the PowerEnum extensions to the migrations DSL. module AbstractAdapter # Creates a new enum table. +enum_name+ will be automatically pluralized. # # === Supported options # [:name_column] # Specify the column name for name of the enum. By default it's :name. # This can be a String or a Symbol # [:description] # Set this to true to have a 'description' column generated. # [:name_limit] # Set this define the limit of the name column. # [:desc_limit] # Set this to define the limit of the description column. # [:active] # Set this to true to have a boolean 'active' column generated. The 'active' column will have the options of NOT NULL and DEFAULT TRUE. # [:timestamps] # Set this to true to have timestamp columns (created_at and updated_at) generated. # [:table_options] # A hash of options to pass to the 'create_table' method. # # You can also pass in a block that takes a table object as an argument, like create_table. # # ===== Examples # ====== Basic Enum # create_enum :connector_type # is the equivalent of # create_table :connector_types do |t| # t.string :name, :null => false # end # add_index :connector_types, [:name], :unique => true # # ====== Advanced Enum # create_enum :connector_type, :name_column => :connector, # :name_limit => 50, # :description => true, # :desc_limit => 100, # :active => true, # :timestamps => true, # :table_options => {:primary_key => :foo} # is the equivalent of # create_table :connector_types, :primary_key => :foo do |t| # t.string :connector, :limit => 50, :null => false # t.string :description, :limit => 100 # t.boolean :active, :null => false, :default => true # t.timestamps # end # add_index :connector_types, [:connector], :unique => true # # ====== Customizing Enum with a block # create_enum :connector_type, :description => true do |t| # t.boolean :has_sound # end # is the equivalent of # create_table :connector_types do |t| # t.string :name, :null => false # t.string :description # t.boolean :has_sound # end # add_index :connector_types, [:connector], :unique => true # # Notice that a unique index is automatically created in each case on the proper name column. def create_enum(enum_name, options = {}, &block) enum_table_name = enum_name.pluralize # For compatibility with PgPower/PgSaurus schema_name = options[:schema] enum_table_name = "#{schema_name}.#{enum_table_name}" if schema_name name_column = options[:name_column] || :name generate_description = !!options[:description] generate_active = !!options[:active] generate_timestamps = !!options[:timestamps] name_limit = options[:name_limit] desc_limit = options[:desc_limit] table_options = options[:table_options] || {} create_table enum_table_name, table_options do |t| t.string name_column, :limit => name_limit, :null => false if generate_description t.string :description, :limit => desc_limit end if generate_active t.boolean :active, :null => false, :default => true end if generate_timestamps t.timestamps end if block_given? yield t end end add_index enum_table_name, [name_column], :unique => true end # Drops the enum table. +enum_name+ will be automatically pluralized. # # ===== Example # remove_enum :connector_type # is the equivalent of # drop_table :connector_types def remove_enum(enum_name) drop_table enum_name.pluralize end end end