module Mobility::Backends::Table

Stores attribute translation as rows on a model-specific translation table (similar to Globalize). By default, the table name for a model Post with table posts will be post_translations, and the translation class will be Post::Translation. The translation class is dynamically created when the backend is initialized on the model class, and subclasses {Mobility::Backends::ActiveRecord::Table::Translation} (for AR models) or inherits {Mobility::Backends::Sequel::Table::Translation} (for Sequel models).

The backend expects the translations table (post_translations) to have:

If you are using Rails, you can use the mobility:translations generator to create a migration generating this table with:

rails generate mobility:translations post title:string content:text

Unlike Globalize, attributes need not all be on one table. Mobility supports any number of translation tables for a given model class (all of the structure described above), provided the association_name option is different for each. Some translations can be stored on one translation table, others on another, and Mobility will handle mapping reads/writes to each. The subclass used in this case will be generated from the association_name by singularizing it and converting it to camelcase.

For more details, see examples in {Mobility::Backends::ActiveRecord::Table}.

Backend Options

association_name

Name of association on model. Defaults to :translations. If specified, ensure name does not overlap with other methods on model or with the association name used by other backends on model (otherwise one will overwrite the other).

table_name

Name of translations table. By default, if the table used by the model is posts, the table name used for translations will be post_translations.

foreign_key

Foreign key to use in defining the association on the model. By default, if the model is a Post, this will be post_id. Generally this does not need to be set.

subclass_name

Subclass to use when dynamically generating translation class for model, by default :Translation. Should be a symbol. Generally this does not need to be set.

@see Mobility::Backends::ActiveRecord::Table @see Mobility::Backends::Sequel::Table

Private Class Methods

included(backend_class) click to toggle source
# File lib/mobility/backends/table.rb, line 108
def self.included(backend_class)
  backend_class.extend ClassMethods
  backend_class.option_reader :association_name
  backend_class.option_reader :subclass_name
  backend_class.option_reader :foreign_key
  backend_class.option_reader :table_name
end

Public Instance Methods

each_locale() { |locale.to_sym| ... } click to toggle source

@!macro backend_iterator

# File lib/mobility/backends/table.rb, line 98
def each_locale
  translations.each { |t| yield t.locale.to_sym }
end
read(locale, **options) click to toggle source

@!group Backend Accessors @!macro backend_reader

# File lib/mobility/backends/table.rb, line 87
def read(locale, **options)
  translation_for(locale, **options).send(attribute)
end
write(locale, value, **options) click to toggle source

@!macro backend_writer

# File lib/mobility/backends/table.rb, line 92
def write(locale, value, **options)
  translation_for(locale, **options).send("#{attribute}=", value)
end

Private Instance Methods

translations() click to toggle source
# File lib/mobility/backends/table.rb, line 104
def translations
  model.send(association_name)
end