Module: Immigrant::ForeignKeyExtensions

Includes:
Foreigner::SchemaDumper::ClassMethods
Defined in:
lib/immigrant/compat/foreigner.rb,
lib/immigrant/compat/active_record.rb,
lib/immigrant/foreign_key_extensions.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(klass) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
# File 'lib/immigrant/compat/foreigner.rb', line 25

def self.included(klass)
  # ForeignKeyExtensions already overrides initialize; override it
  # some more
  klass.send(:include, Module.new{
    def initialize(from_table, to_table, options)
      options.delete(:on_update)
      options[:dependent] ||= normalize_dependent(options.delete(:on_delete))
      super
    end
  })
end

Instance Method Details

#dump_foreign_key(foreign_key) ⇒ Object

DRY alert: copied from ActiveRecord::SchemaDumper#foreign_keys



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/immigrant/compat/active_record.rb', line 11

def dump_foreign_key(foreign_key)
  parts = [
    "add_foreign_key #{remove_prefix_and_suffix(foreign_key.from_table).inspect}",
    remove_prefix_and_suffix(foreign_key.to_table).inspect,
  ]

  if foreign_key.column != foreign_key_column_for(foreign_key.to_table)
    parts << "column: #{foreign_key.column.inspect}"
  end

  if foreign_key.custom_primary_key?
    parts << "primary_key: #{foreign_key.primary_key.inspect}"
  end

  if foreign_key.name !~ /^fk_rails_[0-9a-f]{10}$/
    parts << "name: #{foreign_key.name.inspect}"
  end

  parts << "on_update: #{foreign_key.on_update.inspect}" if foreign_key.on_update
  parts << "on_delete: #{foreign_key.on_delete.inspect}" if foreign_key.on_delete

  parts.join(', ')
end

#foreign_key_column_for(table_name) ⇒ Object



40
41
42
# File 'lib/immigrant/compat/active_record.rb', line 40

def foreign_key_column_for(table_name)
  "#{table_name.to_s.singularize}_id"
end

#hash_keyObject



10
11
12
# File 'lib/immigrant/foreign_key_extensions.rb', line 10

def hash_key
  [from_table, options[:column]]
end

#initialize(from_table, to_table, options, *args) ⇒ Object



4
5
6
7
8
# File 'lib/immigrant/foreign_key_extensions.rb', line 4

def initialize(from_table, to_table, options, *args)
  options ||= {}
  options[:name] ||= "#{from_table}_#{options[:column]}_fk"
  super(from_table, to_table, options, *args)
end

#normalize_dependent(value) ⇒ Object



37
38
39
40
41
42
# File 'lib/immigrant/compat/foreigner.rb', line 37

def normalize_dependent(value)
  case value
  when :cascade then :delete
  else value
  end
end

#remove_prefix_and_suffix(table) ⇒ Object



36
37
38
# File 'lib/immigrant/compat/active_record.rb', line 36

def remove_prefix_and_suffix(table)
  table.gsub(/^(#{ActiveRecord::Base.table_name_prefix})(.+)(#{ActiveRecord::Base.table_name_suffix})$/,  "\\2")
end

#to_ruby(action = :add) ⇒ Object



14
15
16
17
18
19
20
21
# File 'lib/immigrant/foreign_key_extensions.rb', line 14

def to_ruby(action = :add)
  if action == :add
    dump_foreign_key(self)
  else
    "remove_foreign_key #{from_table.inspect}, " \
    ":name => #{options[:name].inspect}"
  end
end