Home > Back-end >  Importing via csv data in jsonb format
Importing via csv data in jsonb format

Time:04-03

Using the mobility gem for i18n, the process of importing data from CSV for jsonb data is not succeeding.

Whereas, one generally imports

Class.create(
  name_en: row[2],
  name_fr: row[3],
  [...]

for the local-driven values in a key_value backend, with a postgresql backend the column has to be populated with hash, with the key and value.

However, the syntax is incorrect name: { 'en' = row[2], 'fr' = row[2]} leads to error
syntax error, unexpected '=', expecting '.' or &. or :: or '['

and name: { 'en': row[2], 'fr': row[2]} seems syntaxtically correct, but yields
Error importing row because 'No plugin configured for these keys: type.'

note this occurs with any of the following definitions in config/initializers/mobility.rb`

    backend :jsonb
    backend :jsonb, type: :json
    backend :jsonb, type: :string

CodePudding user response:

Managed to set it up. It's actually straightforward, mobility's docs on github make it more confusing than it is.

Set up your migrations with jsonb columns for each attribute, it's recommended to set default as well default: {}.

# db/migrate/20220402201700_create_articles.rb
class CreateArticles < ActiveRecord::Migration[7.0]
  def change
    create_table :articles do |t|
      t.jsonb :title, default: {}
    end
  end
end

Model set up is unchanged https://github.com/shioyama/mobility#getting-started

# app/models/article.rb
class Article < ApplicationRecord
  extend Mobility
  translates :title
end

To set up locale accessors, locale_accessors plugin must be enabled. https://github.com/shioyama/mobility#-getting-and-setting-translations

# config/initializers/mobility.rb
Mobility.configure do
  plugins do
    backend :jsonb
    locale_accessors # enable locale accessors, like 'name_en'
    # ...
  end
end

Import transaltions

Article.create(title_en: 'Importing via csv data in jsonb format',
               title_fr: 'Importation via des données csv au format jsonb')

# Article.last.title_backend.read(:fr) # => "Importation via des ..."
# this doesn't work, as far as I can tell
# it'll wrap the entire hash in `en` locale
Article.create(title: { en: '', fr: ''} )

For other ways to save translations: https://github.com/shioyama/mobility#-getting-and-setting-translations

mobility v1.2.6 rails v7.0.2.3 ruby v3.1.1

  • Related