如何创建这个MongoMapper自定义数据类型?

时间:2010-03-21 06:29:34

标签: ruby-on-rails mongomapper custom-data-type

我正在尝试在RoR 2.3.5中创建一个名为Translatable的自定义MongoMapper数据类型:

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 :(得分:0)

您还没有告诉我们Translatable如何存储其各种翻译版本的内部表示。除了MongoMapper集成之外,你有一个有效的Translatable类吗?如果是这样,你可以发布完整的来源吗?

我认为,为了论证,Translateable有一个名为@translated_versions的Hash实例变量,它从文化符号映射到翻译的字符串。然后,您可以将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添加代码以将这些方法委托给您。

答案 1 :(得分:0)

最好使用 i18n gem 来处理+存储翻译! 并在模型中指定一个I18N-lookup-key,然后使用I18N translate()方法根据用户的语言环境查找正确的翻译。

在你的情况下,我建议只存储一个符号页面标题,然后将其用作I18N的查找键

./config/locales/

下的静态翻译文件中查找I18N密钥

请参阅:

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

例外:

仅当您希望用户能够在您的Web应用程序中动态指定翻译时,您可能希望将翻译存储在数据库中。

经过一番挖掘,我找到了这个宝石,它将翻译存储在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