module GlobalizeCurrentTranslation::Scope

Public Class Methods

included(base) click to toggle source
# File lib/globalize_current_translation/scope.rb, line 2
def self.included(base)
  translation_class_name = "#{base.name}::Translation"
  translation_class = translation_class_name.constantize
  table_name = translation_class.table_name
  foreign_key_name = base.reflections["translations"].foreign_key

  scope_proc = proc do
    locales_list = I18n.available_locales.join("', '")
    sub_query_sql = "#{table_name}.#{translation_class.primary_key} = (" \
      "SELECT #{table_name}.#{translation_class.primary_key} " \
      "FROM #{table_name} " \
      "WHERE #{table_name}.#{foreign_key_name} = #{base.table_name}.#{base.primary_key} AND " \
        "#{table_name}.locale IN ('#{locales_list}') " \
      "ORDER BY " \
      "CASE WHEN #{table_name}.locale = '#{I18n.locale}' THEN 1 " \
      "ELSE 2 " \
      "END " \
      "LIMIT 1" \
      ")"

    where(sub_query_sql)
  end

  base.has_one :current_translation, scope_proc, class_name: translation_class_name
end