Class: DeclareSchema::Model::ForeignKeyDefinition

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/declare_schema/model/foreign_key_definition.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model, foreign_key, options = {}) ⇒ ForeignKeyDefinition

Returns a new instance of ForeignKeyDefinition.



13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/declare_schema/model/foreign_key_definition.rb', line 13

def initialize(model, foreign_key, options = {})
  @model = model
  @foreign_key = foreign_key.to_s.presence
  @options = options

  @child_table_name = model.table_name # unless a table rename, which would happen when a class is renamed??
  @parent_table_name = options[:parent_table]&.to_s
  @foreign_key_name = options[:foreign_key]&.to_s || @foreign_key

  @constraint_name = options[:constraint_name]&.to_s.presence ||
                       model.connection.index_name(model.table_name, column: @foreign_key_name)
  @on_delete_cascade = options[:dependent] == :delete
end

Instance Attribute Details

#child_table_nameObject (readonly)

Returns the value of attribute child_table_name.



10
11
12
# File 'lib/declare_schema/model/foreign_key_definition.rb', line 10

def child_table_name
  @child_table_name
end

#constraint_nameObject (readonly)

Returns the value of attribute constraint_name.



10
11
12
# File 'lib/declare_schema/model/foreign_key_definition.rb', line 10

def constraint_name
  @constraint_name
end

#foreign_keyObject (readonly)

Returns the value of attribute foreign_key.



10
11
12
# File 'lib/declare_schema/model/foreign_key_definition.rb', line 10

def foreign_key
  @foreign_key
end

#foreign_key_nameObject (readonly)

Returns the value of attribute foreign_key_name.



10
11
12
# File 'lib/declare_schema/model/foreign_key_definition.rb', line 10

def foreign_key_name
  @foreign_key_name
end

#modelObject (readonly)

Returns the value of attribute model.



10
11
12
# File 'lib/declare_schema/model/foreign_key_definition.rb', line 10

def model
  @model
end

#on_delete_cascadeObject (readonly)

Returns the value of attribute on_delete_cascade.



10
11
12
# File 'lib/declare_schema/model/foreign_key_definition.rb', line 10

def on_delete_cascade
  @on_delete_cascade
end

#optionsObject (readonly)

Returns the value of attribute options.



10
11
12
# File 'lib/declare_schema/model/foreign_key_definition.rb', line 10

def options
  @options
end

#parent_table_nameObject (readonly)

Returns the value of attribute parent_table_name.



10
11
12
# File 'lib/declare_schema/model/foreign_key_definition.rb', line 10

def parent_table_name
  @parent_table_name
end

Class Method Details

.for_model(model, old_table_name) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/declare_schema/model/foreign_key_definition.rb', line 28

def for_model(model, old_table_name)
  show_create_table = model.connection.select_rows("show create table #{model.connection.quote_table_name(old_table_name)}").first.last
  constraints = show_create_table.split("\n").map { |line| line.strip if line['CONSTRAINT'] }.compact

  constraints.map do |fkc|
    name, foreign_key, parent_table = fkc.match(/CONSTRAINT `([^`]*)` FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)`/).captures
    options = {
      constraint_name: name,
      parent_table:    parent_table,
      foreign_key:     foreign_key
    }
    options[:dependent] = :delete if fkc['ON DELETE CASCADE']

    new(model, foreign_key, options)
  end
end

Instance Method Details

#<=>(rhs) ⇒ Object



64
65
66
# File 'lib/declare_schema/model/foreign_key_definition.rb', line 64

def <=>(rhs)
  key <=> rhs.send(:key)
end

#parent_classObject

returns the parent class as a Class object or nil if no :class_name option given



48
49
50
51
52
53
54
55
56
# File 'lib/declare_schema/model/foreign_key_definition.rb', line 48

def parent_class
  if (class_name = options[:class_name])
    if class_name.is_a?(Class)
      class_name
    else
      class_name.to_s.constantize
    end
  end
end