Как создать этот пользовательский тип данных MongoMapper?

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

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), если культура не указана.

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


person Dom    schedule 21.03.2010    source источник
comment
Дэвид Куадрадо был достаточно любезен, чтобы помочь мне пройти часть пути через группу Google MongoMapper со следующим кодом: pastie.org/873220, но я не получаю желаемых результатов.   -  person Dom    schedule 21.03.2010


Ответы (2)


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

Я предположу, ради аргумента, у 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 

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

person Matt Gillooly    schedule 20.04.2010

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

В вашем случае я бы предложил просто сохранить символический заголовок страницы, который затем используется в качестве ключа поиска для 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

person Tilo    schedule 02.11.2011
comment
Исключением является причина для желания сделать это. Спасибо за ваш ответ в любом случае. Я использую i18n везде. - person Dom; 10.11.2011
comment
Пожалуйста, проверьте обновленный ответ - я нашел драгоценный камень, который хранит переводы в ActiveRecord. - person Tilo; 10.11.2011