Container Backend - shioyama/mobility GitHub Wiki

The container backend is a new backend available as of version 0.4.x, which stores all translations for a model on a single json/jsonb column, defaulting to the translations column. See this PR and this blog post for background.

To use this backends, you will need to first add a column (named translations) to each translated model.

Setup

Rails/ActiveRecord

rails generate migration AddTranslationsToPosts translations:jsonb

(As of Mobility 0.5, this column can also alternatively be a json column, with mostly the same behavior.)

Once the migration is created, make sure to change the actual migration to set the default value of the column(s) to an empty jsonb object ({}), so it looks like this:

def change
  add_column :posts, :translations, :jsonb, default: {}
end

Then run the migration with rake db:migrate to add the column to your model table.

Using the backend is then as simple as setting your default backend to :container, and defining the attributes on the model:

class Post < ApplicationRecord
  extend Mobility
  translates :title, :content
end

Translated attributes title and content are now available. Mobility will now save the values of title and content in a depth-2 hash where the first level keys are locales.

Since translations are now stored in just a single database column, you can see the translations for both attributes by simply accessing the translations column:

post = Post.create(title: "foo")
post.title
#=> "foo"
post.content = "bar"
Mobility.with_locale(:ja) { post.title = "あああ" }
post.save
post = Post.first
post.translations
#=> {"en"=>{"title"=>"foo", "content"=>"bar"}, "ja"=>{"title"=>"あああ"}}

Like other backends, you can also query on these translated attributes using the i18n scope/dataset.

Post.i18n.where(title: "foo").to_sql
#=> SELECT "posts".* FROM "posts" WHERE ((("posts"."translations" -> 'en') ->  'title') = "foo")

Sequel

Mostly the same as above. Make sure to enable extensions as described in the Postgres Backends page.

Caveats

See the caveats section of the the Postgres Backends page.