Как создать этот пользовательский тип данных MongoMapper? - PullRequest
1 голос
/ 21 марта 2010

Я пытаюсь создать пользовательский тип данных MongoMapper в RoR 2.3.5 с именем Transhable:

class Translatable < String
  def initialize(translation, culture="en") 
  end 

  def languages
  end

  def has_translation(culture)?
  end

  def self.to_mongo(value) 
  end 

  def self.from_mongo(value) 
  end 
end 

Я хочу использовать его следующим образом:

class Page 
  include MongoMapper::Document 
  key :title, Translatable, :required => true 
  key :content, String 
end

Тогда реализуйте так:

p = Page.new 
p.title = "Hello" 
p.title(:fr) = "Bonjour" 
p.title(:es) = "Hola" 
p.content = "Some content here" 
p.save

p = Page.first
p.languages
=> [:en, :fr, :es]
p.has_translation(:fr)
=> true
en = p.title 
=> "Hello" 
en = p.title(:en)
=> "Hello"
fr = p.title(:fr) 
=> "Bonjour" 
es = p.title(:es) 
=> "Hola" 

В mongoDB я предполагаю, что информация будет храниться как:

{ "_id" : ObjectId("4b98cd7803bca46ca6000002"), "title" : { "en" : 
"Hello", "fr" : "Bonjour", "es" : "Hola" }, "content" : "Some content 
here" } 

Итак, Page.title - это строка, которая по умолчанию на английском (: en), когда культура не указано.

Буду очень признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2011

лучше использовать i18n gem для обработки + хранения переводов!и просто указать I18N-ключ поиска в вашей модели, который затем использует метод translate () I18N для поиска правильного перевода на основе локали пользователя.

В вашем случае я бы предложилпросто сохраните символический заголовок страницы, который затем используется как ключ поиска для I18N

Ключи I18N ищутся в файлах статического перевода в ./config/locales/

См .:

http://guides.rubyonrails.org/i18n.html

Исключение:

только если вы хотите, чтобы пользователи могли динамически указывать переводы в вашем веб-приложении, вы можете захотеть сохранить переводы в базе данных.

После небольшого копания я нашел этот драгоценный камень, в котором хранятся переводы в ActiveRecord:

Вероятно, его можно легко адаптировать для MongoDB:

https://github.com/grosser/fast_gettext

https://github.com/grosser/fast_gettext/blob/master/examples/db/migration.rb

Также:

http://groups.google.com/group/rails-i18n/browse_thread/thread/6b7ba3c401890a7e

https://github.com/svenfuchs/i18n/blob/df498763cd1968c58900d66a322325d9db8b0d06/lib/i18n/backend/active_record/translation.rb#L18

0 голосов
/ 20 апреля 2010

Вы не сказали нам, как Transhable хранит свое внутреннее представление различных переведенных версий. Помимо интеграции с MongoMapper, есть ли у вас работающий переводимый класс? Если да, не могли бы вы опубликовать полный исходный код?

Я предполагаю, что для аргумента Translateable имеет переменную экземпляра Hash с именем @translated_versions, которая отображает символы культуры в переведенные строки. Затем вы можете реализовать интеграцию с MongoMapper следующим образом:

class Translatable < String
  attr_reader :translated_versions

  def initialize(value)
    @translated_versions = value
  end

  def self.to_mongo(value)
    value.translated_versions
  end

  def self.from_mongo(value) 
    self.new(value)
  end
end 

Это даст вам достаточно места, чтобы хранить ваши переводимые экземпляры как ключи MongoMapper. Обратите внимание, что p.languages ​​и p.has_translation (: fr) все равно не будут работать, так как вы определили эти методы только для Transurable, а не для Page. Вам нужно будет либо вызвать p.title.languages ​​и p.title.has_translation (: fr), либо добавить код в Page, чтобы делегировать эти методы заголовку для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...