나는이 json
내에서 열 Categories
테이블을하고 난 JSON 파일에서 번역 각 카테고리의 기록을 업데이트 할. 범주 배열을 포함하고 각 범주에 이름과 번역이 포함되도록 json 파일을 만들었습니다.
{
"categories": [
{
"name": "starter",
"message": "Abs/Анти блокираща система (система против боксуване)"
},
{
"name": "alternator",
"message": "Алтернатор"
}
...
]
}
모든 카테고리 레코드가 언어 키와 파일의 번역으로 업데이트되기를 바랍니다.
{ bg: 'translation from file' }
이 코드가 있습니다
file = File.read('app/services/translations/files/bg.json')
data = JSON.parse(file)
language = File.basename(file, '.json')
Translations::CategoriesMigrator.call(file: data, language: language)
module Translations
class CategoriesMigrator < Service
def initialize(category_repo: Category)
@category_repo = category_repo
end
def call(file:, language:)
file['categories'].each do |category|
found_category = @category_repo.find_by(name: category['name'])
found_category.translated_categories[language] = category['message']
found_category.save
end
end
end
end
지금은 단일 카테고리 레코드에 모든 카테고리가 있습니다. 내가 도대체 뭘 잘못하고있는 겁니까?
내 db 마이그레이션은 다음과 같습니다.
class AddTranslatedCategoriesToCategories < ActiveRecord::Migration[5.1]
def change
add_column :categories, :translated_categories, :jsonb, null: false, default: {}
add_index :categories, :translated_categories, using: :gin
end
end
관계형 모델에 맞지 않는 데이터가있는 경우 JSON / JSONB를 선택하는 것이 좋습니다. 대부분의 다른 경우에는 데이터 쿼리를 훨씬 어렵게 만들고 데이터 무결성 또는 정규화를 제공하지 않기 때문에 안티 패턴입니다.
이 경우는 밑받침 구조가 동적이 아니기 때문에 분명히 나중입니다. 번역을 추적하려면 제목, 언어 및 번역 만 알면됩니다.
class Category
has_many :category_translations
end
# rails g model category_translation category:belongs_to locale:string text:string
class CategoryTranslation
belongs_to :category
end
고유성을 적용하기 위해 category_id 및 로케일에 복합 색인을 추가 할 수 있습니다.
보다:
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다