# File lib/db_schema/dsl.rb, line 83 def primary_key(*columns, name: nil) index(*columns, name: name, primary: true, unique: true) end
class DbSchema::DSL::TableYielder
Attributes
table_name[R]
Public Class Methods
build_foreign_key(fkey_fields, table_name:, references:, name: nil, on_update: :no_action, on_delete: :no_action, deferrable: false)
click to toggle source
# File lib/db_schema/dsl.rb, line 195 def build_foreign_key(fkey_fields, table_name:, references:, name: nil, on_update: :no_action, on_delete: :no_action, deferrable: false) fkey_name = name || :"#{table_name}_#{fkey_fields.first}_fkey" if references.is_a?(Array) # [:table, :field] referenced_table, *referenced_keys = references Definitions::ForeignKey.new( name: fkey_name, fields: fkey_fields, table: referenced_table, keys: referenced_keys, on_delete: on_delete, on_update: on_update, deferrable: deferrable ) else # :table Definitions::ForeignKey.new( name: fkey_name, fields: fkey_fields, table: references, on_delete: on_delete, on_update: on_update, deferrable: deferrable ) end end
build_index(columns, table_name:, name: nil, primary: false, unique: false, using: :btree, where: nil, **ordered_fields)
click to toggle source
# File lib/db_schema/dsl.rb, line 146 def build_index(columns, table_name:, name: nil, primary: false, unique: false, using: :btree, where: nil, **ordered_fields) if columns.last.is_a?(Hash) *ascending_columns, ordered_expressions = columns else ascending_columns = columns ordered_expressions = {} end columns_data = ascending_columns.each_with_object({}) do |column_name, columns| columns[column_name] = :asc end.merge(ordered_fields).merge(ordered_expressions) index_columns = columns_data.map do |column_name, column_order_options| options = case column_order_options when :asc {} when :desc { order: :desc } when :asc_nulls_first { nulls: :first } when :desc_nulls_last { order: :desc, nulls: :last } else raise ArgumentError, 'Only :asc, :desc, :asc_nulls_first and :desc_nulls_last options are supported.' end if column_name.is_a?(String) Definitions::Index::Expression.new(column_name, **options) else Definitions::Index::TableField.new(column_name, **options) end end index_name = name || if primary "#{table_name}_pkey" else "#{table_name}_#{index_columns.map(&:index_name_segment).join('_')}_index" end Definitions::Index.new( name: index_name, columns: index_columns, primary: primary, unique: unique, type: using, condition: where ) end
new(table_name, block)
click to toggle source
# File lib/db_schema/dsl.rb, line 55 def initialize(table_name, block) @table_name = table_name block.call(self) end
Public Instance Methods
array(name, of:, **options)
click to toggle source
# File lib/db_schema/dsl.rb, line 68 def array(name, of:, **options) field(name, :array, element_type: of, **options) end
check(name, condition)
click to toggle source
# File lib/db_schema/dsl.rb, line 95 def check(name, condition) checks << Definitions::CheckConstraint.new(name: name, condition: condition) end
checks()
click to toggle source
# File lib/db_schema/dsl.rb, line 137 def checks @checks ||= [] end
field(name, type, primary_key: false, unique: false, index: false, references: nil, check: nil, **options)
click to toggle source
# File lib/db_schema/dsl.rb, line 107 def field(name, type, primary_key: false, unique: false, index: false, references: nil, check: nil, **options) fields << Definitions::Field.build(name, type, options) if primary_key primary_key(name) end if unique index(name, unique: true) elsif index index(name) end if references foreign_key(name, references: references) end if check check("#{table_name}_#{name}_check", check) end end
fields()
click to toggle source
# File lib/db_schema/dsl.rb, line 129 def fields @fields ||= [] end
foreign_key(*fkey_fields, **fkey_options)
click to toggle source
# File lib/db_schema/dsl.rb, line 99 def foreign_key(*fkey_fields, **fkey_options) foreign_keys << TableYielder.build_foreign_key( fkey_fields, table_name: table_name, **fkey_options ) end
foreign_keys()
click to toggle source
# File lib/db_schema/dsl.rb, line 141 def foreign_keys @foreign_keys ||= [] end
index(*columns, **index_options)
click to toggle source
# File lib/db_schema/dsl.rb, line 87 def index(*columns, **index_options) indexes << TableYielder.build_index( columns, table_name: table_name, **index_options ) end
indexes()
click to toggle source
# File lib/db_schema/dsl.rb, line 133 def indexes @indexes ||= [] end
method_missing(method_name, name, *args, &block)
click to toggle source
# File lib/db_schema/dsl.rb, line 79 def method_missing(method_name, name, *args, &block) field(name, method_name, args.first || {}) end
primary_key(*columns, name: nil)
click to toggle source