Class: Translatable::DatabaseStrategies::MySQL

Inherits:
Base
  • Object
show all
Defined in:
lib/translatable/database_strategies/mysql.rb

Instance Method Summary collapse

Methods inherited from Base

for_adapter

Instance Method Details

#column_typeObject



4
5
6
# File 'lib/translatable/database_strategies/mysql.rb', line 4

def column_type
  :json
end

#migration_example(table_name, column_name) ⇒ Object



8
9
10
# File 'lib/translatable/database_strategies/mysql.rb', line 8

def migration_example(table_name, column_name)
  "add_column :#{table_name}, :#{column_name}, :json, null: false"
end

#where_translations_scope(model_class, attributes, locales: [], case_sensitive: false) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/translatable/database_strategies/mysql.rb', line 12

def where_translations_scope(model_class, attributes, locales: [], case_sensitive: false)
  column_name = model_class.translations_column_name
  search_locales = locales.present? ? locales.map(&:to_s) : model_class.translatable_locales.map(&:to_s)
  
  return model_class.none if attributes.blank?
  
  conditions = []
  bind_values = []
  
  if case_sensitive
    search_locales.each do |locale|
      locale_attributes = { locale => attributes }
      conditions << "JSON_CONTAINS(#{column_name}, ?)"
      bind_values << locale_attributes.to_json
    end
  else
    search_locales.each do |locale|
      attributes.each do |field, value|
        conditions << "UPPER(JSON_UNQUOTE(JSON_EXTRACT(#{column_name}, ?))) LIKE UPPER(?)"
        bind_values += ["$.#{locale}.#{field}", value.to_s]
      end
    end
  end
  
  where_clause = conditions.join(' OR ')
  model_class.where(where_clause, *bind_values)
end