module Mobility::Backends::Serialized

Stores translations as serialized attributes in a single text column. This implies that the translated values are not searchable, and thus this backend is not recommended unless specific constraints prevent use of other solutions.

To use this backend, ensure that the model table has a text column on its table with the same name as the translated attribute.

Backend Options

format

Format for serialization. Either :yaml (default) or :json.

@see Mobility::Backends::ActiveRecord::Serialized @see Mobility::Backends::Sequel::Serialized

Public Class Methods

configure(options) click to toggle source

@!group Backend Configuration @option options [Symbol] format (:yaml) Serialization format @raise [ArgumentError] if a format other than :yaml or :json is passed in

# File lib/mobility/backends/serialized.rb, line 31
def configure(options)
  options[:format] ||= :yaml
  options[:format] = options[:format].downcase.to_sym
  raise ArgumentError, "Serialized backend only supports yaml or json formats." unless [:yaml, :json].include?(options[:format])
end
deserializer_for(format) click to toggle source
# File lib/mobility/backends/serialized.rb, line 54
def deserializer_for(format)
  case format
  when :yaml
    lambda { |v| YAML.load(v) }
  when :json
    lambda { |v| JSON.parse(v, symbolize_names: true) }
  end
end
serializer_for(format) click to toggle source

@!endgroup

# File lib/mobility/backends/serialized.rb, line 38
def serializer_for(format)
  lambda do |obj|
    return if obj.nil?
    if obj.is_a? ::Hash
      obj = obj.inject({}) do |translations, (locale, value)|
        translations[locale] = value.to_s unless value.nil?
        translations
      end
    else
      raise ArgumentError, "Attribute is supposed to be a Hash, but was a #{obj.class}. -- #{obj.inspect}"
    end

    obj.send("to_#{format}")
  end
end

Public Instance Methods

check_opts(opts) click to toggle source
# File lib/mobility/backends/serialized.rb, line 64
def check_opts(opts)
  if keys = extract_attributes(opts)
    raise ArgumentError,
      "You cannot query on mobility attributes translated with the Serialized backend (#{keys.join(", ")})."
  end
end