class Globalize::ActiveRecord::Adapter

Attributes

record[RW]

The cache caches attributes that already were looked up for read access. The stash keeps track of new or changed values that need to be saved.

stash[RW]

The cache caches attributes that already were looked up for read access. The stash keeps track of new or changed values that need to be saved.

Public Class Methods

new(record) click to toggle source
# File lib/globalize/active_record/adapter.rb, line 11
def initialize(record)
  @record = record
  @stash = Attributes.new
end

Public Instance Methods

fetch(locale, name) click to toggle source
# File lib/globalize/active_record/adapter.rb, line 23
def fetch(locale, name)
  record.globalize_fallbacks(locale).each do |fallback|
    value = stash.contains?(fallback, name) ? fetch_stash(fallback, name) : fetch_attribute(fallback, name)

    unless fallbacks_for?(value)
      set_metadata(value, :locale => fallback, :requested_locale => locale)
      return value
    end
  end

  return nil
end
fetch_stash(locale, name) click to toggle source
# File lib/globalize/active_record/adapter.rb, line 16
def fetch_stash(locale, name)
  stash.read(locale, name)
end
reset() click to toggle source
# File lib/globalize/active_record/adapter.rb, line 54
def reset
  stash.clear
end
save_translations!() click to toggle source
# File lib/globalize/active_record/adapter.rb, line 36
def save_translations!
  stash.each do |locale, attrs|
    next if attrs.empty?

    translation = record.translations_by_locale[locale] ||
                  record.translations.build(locale: locale.to_s)
    attrs.each do |name, value|
      value = value.val if value.is_a?(Arel::Nodes::Casted)
      translation[name] = value
    end

    ensure_foreign_key_for(translation)
    translation.save!
  end

  reset
end

Protected Instance Methods

column_for_attribute(name) click to toggle source
# File lib/globalize/active_record/adapter.rb, line 72
def column_for_attribute(name)
  translation_class.columns_hash[name.to_s]
end
ensure_foreign_key_for(translation) click to toggle source

Sometimes the translation is initialised before a foreign key can be set.

# File lib/globalize/active_record/adapter.rb, line 61
def ensure_foreign_key_for(translation)
  # AR >= 4.1 reflections renamed to _reflections
  translation[translation.class.reflections.stringify_keys["globalized_model"].foreign_key] = record.id
end
fallbacks_for?(object) click to toggle source
# File lib/globalize/active_record/adapter.rb, line 100
def fallbacks_for?(object)
  object.nil? || (fallbacks_for_empty_translations? && object.blank?)
end
fetch_attribute(locale, name) click to toggle source
# File lib/globalize/active_record/adapter.rb, line 80
def fetch_attribute(locale, name)
  translation = record.translation_for(locale, false)
  if translation
    translation.send(name)
  else
    record.class.translation_class.new.send(name)
  end
end
set_metadata(object, metadata) click to toggle source
# File lib/globalize/active_record/adapter.rb, line 89
def set_metadata(object, metadata)
  object.translation_metadata.merge!(metadata) if object.respond_to?(:translation_metadata)
  object
end
translation_metadata_accessor(object) click to toggle source
# File lib/globalize/active_record/adapter.rb, line 94
def translation_metadata_accessor(object)
  return if obj.respond_to?(:translation_metadata)
  class << object; attr_accessor :translation_metadata end
  object.translation_metadata ||= {}
end
type_cast(name, value) click to toggle source
# File lib/globalize/active_record/adapter.rb, line 66
def type_cast(name, value)
  return value.presence unless column = column_for_attribute(name)

  column.type_cast value
end
unserializable_attribute?(name, column) click to toggle source
# File lib/globalize/active_record/adapter.rb, line 76
def unserializable_attribute?(name, column)
  column.text? && translation_class.serialized_attributes[name.to_s]
end