Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.Sign up
The Column backend stores translations as columns on the model table, with a suffix for the locale.
A detailed description of this backend is provided as "Strategy #1" in this blog post.
Generating Translatable Columns
Although it is quite simple to add columns to the model table, there is a built-in generator to make this just a little bit easier. If your default backend is set to
:column, and you want to add columns for all locales in
I18n.available_locales to a model
Post with attributes
title (string) and
content (text), here is how you would do it:
rails generate mobility:translations post title:string content:text
--backend=column as an option if your default backend is something else. Note that you must have already created the
posts table for this generator to work.)
If your available locales are English, French and Japanese, this will generate a migration like this:
class CreatePostTitleAndContentTranslationsForMobilityColumnBackend < ActiveRecord::Migration[5.0] def change add_column :posts, :title_en, :string add_column :posts, :title_fr, :string add_column :posts, :title_ja, :string add_column :posts, :content_en, :text add_column :posts, :content_fr, :text add_column :posts, :content_ja, :text end end
If you want indexes for these columns (recommended), just pass e.g.
title:string:index to the generator and indexes will be added for
Later, if you add new locales to your application (to
I18n.available_locales) you can add necessary columns by re-running the generator as above with the attribute names. Mobility will only include
add_column calls in the migration for columns (locale + attribute) which are missing.
Querying works like you would expect, using the
Post.i18n.find_by(foo: "fooval", bar: "barval") #=> SELECT "posts".* FROM "posts" WHERE "posts"."foo_en" = "fooval" AND "posts"."bar_en" = "barval" LIMIT 1