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.