通过 jsonb 格式的 csv 数据导入

Importing via csv data in jsonb format

使用 mobility gem for i18n,从 CSV 导入数据的过程 jsonb 数据不成功。

然而,一个通常是进口的

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

对于 key_value 后端中的本地驱动值,具有 postgresql backend 的列必须使用哈希、键和值进行填充。

但是,语法不正确 name: { 'en' = row[2], 'fr' = row[2]} 导致错误
syntax error, unexpected '=', expecting '.' or &. or :: or '['

name: { 'en': row[2], 'fr': row[2]} 在语法上似乎是正确的,但会产生
Error importing row because 'No plugin configured for these keys: type.'

注意 这种情况发生在 config/initializers/mobility.rb`

中的任何以下定义中
    backend :jsonb
    backend :jsonb, type: :json
    backend :jsonb, type: :string

成功设置。它实际上很简单,github 上的移动文档使它比实际情况更混乱。

为每个属性设置 jsonb 列的迁移,建议也设置默认值 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

模型设置未更改 https://github.com/shioyama/mobility#getting-started

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

要设置语言环境访问器,必须启用 locale_accessors 插件。 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

导入交易

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: ''} )

其他保存翻译的方法:https://github.com/shioyama/mobility#-getting-and-setting-translations

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