Class: DbSchema::DSL::TableYielder

Inherits:
Object
  • Object
show all
Defined in:
lib/db_schema/dsl.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(table_name, block) ⇒ TableYielder

Returns a new instance of TableYielder.



39
40
41
42
# File 'lib/db_schema/dsl.rb', line 39

def initialize(table_name, block)
  @table_name = table_name
  block.call(self)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_name, name, *args, &block) ⇒ Object



135
136
137
138
139
140
141
142
143
# File 'lib/db_schema/dsl.rb', line 135

def method_missing(method_name, name, *args, &block)
  options = args.first || {}

  fields << Definitions::Field::Custom.new(
    name,
    type_name: method_name,
    **options
  )
end

Instance Attribute Details

#table_nameObject (readonly)

Returns the value of attribute table_name.



37
38
39
# File 'lib/db_schema/dsl.rb', line 37

def table_name
  @table_name
end

Instance Method Details

#check(name, condition) ⇒ Object



102
103
104
# File 'lib/db_schema/dsl.rb', line 102

def check(name, condition)
  checks << Definitions::CheckConstraint.new(name: name, condition: condition)
end

#checksObject



153
154
155
# File 'lib/db_schema/dsl.rb', line 153

def checks
  @checks ||= []
end

#field(name, type, **options) ⇒ Object



54
55
56
# File 'lib/db_schema/dsl.rb', line 54

def field(name, type, **options)
  fields << Definitions::Field.build(name, type, options)
end

#fieldsObject



145
146
147
# File 'lib/db_schema/dsl.rb', line 145

def fields
  @fields ||= []
end

#foreign_key(*fkey_fields, references:, name: nil, on_update: :no_action, on_delete: :no_action, deferrable: false) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/db_schema/dsl.rb', line 106

def foreign_key(*fkey_fields, 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

    foreign_keys << 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
    foreign_keys << Definitions::ForeignKey.new(
      name:       fkey_name,
      fields:     fkey_fields,
      table:      references,
      on_delete:  on_delete,
      on_update:  on_update,
      deferrable: deferrable
    )
  end
end

#foreign_keysObject



157
158
159
# File 'lib/db_schema/dsl.rb', line 157

def foreign_keys
  @foreign_keys ||= []
end

#index(*columns, name: nil, unique: false, using: :btree, where: nil, **ordered_fields) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/db_schema/dsl.rb', line 58

def index(*columns, name: nil, 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 || "#{table_name}_#{index_columns.map(&:index_name_segment).join('_')}_index"

  indices << Definitions::Index.new(
    name:      index_name,
    columns:   index_columns,
    unique:    unique,
    type:      using,
    condition: where
  )
end

#indicesObject



149
150
151
# File 'lib/db_schema/dsl.rb', line 149

def indices
  @indices ||= []
end

#primary_key(name) ⇒ Object



50
51
52
# File 'lib/db_schema/dsl.rb', line 50

def primary_key(name)
  fields << Definitions::Field::Integer.new(name, primary_key: true)
end