Module: TbCore::Mysql2Extensions

Defined in:
lib/tb_core/mysql2_extensions.rb

Instance Method Summary collapse

Instance Method Details

#add_index(table_name, column_name, options = {}) ⇒ Object

Adds an index to the table

See parent method implementation here: api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_index



38
39
40
41
42
43
# File 'lib/tb_core/mysql2_extensions.rb', line 38

def add_index(table_name, column_name, options = {})
  if options[:length].nil? && @connection.query_options[:encoding] == 'utf8mb4'
    options[:length] = length_options_for_utf8mb4_string_index(table_name, column_name)
  end
  super(table_name, column_name, options)
end

#create_table(table_name, options = {}) ⇒ Object

Create a new table



5
6
7
8
9
10
11
# File 'lib/tb_core/mysql2_extensions.rb', line 5

def create_table(table_name, options = {})
  if @connection.query_options[:encoding] == 'utf8mb4'
    super(table_name, options.reverse_merge(:options => 'ROW_FORMAT=DYNAMIC ENGINE=InnoDB'))
  else
    super
  end
end

#length_options_for_utf8mb4_string_index(table_name, column_names) ⇒ Object

Build a hash of length options for a given table and column name

column_name can be either a symbol or an array of symbols



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/tb_core/mysql2_extensions.rb', line 17

def length_options_for_utf8mb4_string_index(table_name, column_names)
  length_options = {}
  column_names = [column_names] unless column_names.is_a?(Array)
  column_names.each do |column_name|
    begin
      column = column_for(table_name, column_name)
      if column && column.type == :string
        length_options[column_name] = ActiveRecord::ConnectionAdapters::Mysql2Adapter::MAX_INDEX_LENGTH_FOR_UTF8MB4
      end
    rescue ActiveRecord::ActiveRecordError => e
      logger.info e.message
    end
  end
  return length_options
end