ActiveRecord 모델에서 다국어 값을 유지 관리하는 데 권장되는 방법은 무엇입니까?DRY 및 데이터베이스 효율적인 방식으로 지역화 된 값을 저장하는 방법 - Ruby on Rails/i18n
데이터베이스 스키마와 개체 모델을 업그레이드하여 많은 값의 국제화가 가능하도록 노력하고 있으며 다양한 방법으로이 작업을 수행하고 있습니다.
rails-i18n system 표준은보기의 텍스트 외에 필드 및 모델 이름을 국제화하기위한 강력한 도구를 제공하지만 대부분이 기능에 대해 침묵합니다.
R18n gem을 사용하면 지역화 된 문자열을 저장하고 로캘에 따라 올바른 값을 나타내는 열을 사용하여 데이터베이스를 오버로드 할 수 있습니다. 이것은 몇 가지 문제점을 제시합니다.
우리가 모델 Sport
- 데이터베이스 테이블 sports
에 대해 말하고 있다고 가정 해보십시오. 영국에서는 '축구'라고 부르더라도 을 검색 할 수 있어야하므로 검색어는 scope :with_name ->(n){ where("name_en_GB = ? OR name_en_AU = ?", n, n) }
이됩니다.
다른 로케일을 추가하려면 스키마를 업데이트하고 해당 스키마에서 이러한 쿼리를 업데이트해야합니다. 오히려 취 약한 해결책.
내가 본 다른 솔루션은 SportLocale
모델과 연결된 이름과 로캘이있는 sport_locales
테이블을 유지 관리하는 것입니다.
class Sport < ActiveRecord::Base
has_many :locales
end
class SportLocale < ActiveRecord::Base
belongs_to :sport
end
는 그런 다음이 Sport
이 유일한 현지화 모델 인 경우 미세하지만
class Sport < ActiveRecord::Base
has_many :locales, class_name: "SportLocale"
self.with_name(n)
SportLocale.where(name: n, locale: I18n.locale).first.try(:sport)
end
end
그런 짓을하려는 바로 스포츠를 찾기 위해 가정
당신은 다른 모든 모델을 추가하기 시작할 때 그것들은 각각 * Locale 모델을 필요로하는 약간 미칠 것입니다. 솔루션 중 DRY
도 아닙니다.
나는
class Sport < ActiveRecord::Base
include Localised
localised_field :name
end
수있는 솔루션을하고 싶습니다 마술 Sport.where(name: 'football')
오른쪽 스포츠를 찾을 수 있습니다.
이미 그러한 시스템이 있습니까? 아니면 직접 구축해야합니까? 다른 프로젝트에서는 이런 종류의 문제를 어떻게 처리합니까?
모델/스키마 레벨에서 모델 속성의 i18n을 처리하고보기 레벨이 아닌 (왜 대부분의 Rails 개발자가 기대할 수 있는지 생각해보십시오.) 정교한 질문을 편집 해주십시오. 그것은 처리되어야 함). 또한, 당신은 당신이 전에 보았던 'SportLocale' 솔루션의 소스를 제공해 줄 수 있습니까? (이 질문은 제안 된 솔루션을 처음 보았습니다). –
폴 이유는 데이터가 정적은 아니지만 더 많은 항목이 시스템에 추가되면 시간이 지나면 빌드됩니다. 뷰는'current_sport.name'을 표시하고 해당 스포츠에 대해 정확하게 현지화 된 이름을 반환 할 수 있어야합니다. 독점적 인 코드베이스에서 본 것처럼'* Locale' 모델 접근법의 소스를 제공 할 수 없습니다. 사실 내가 지금 재 설계하려고하는 것. –