覆盖rails3中模型名称的默认复数

Posted

技术标签:

【中文标题】覆盖rails3中模型名称的默认复数【英文标题】:override default pluralize for model-name in rails3 【发布时间】:2011-09-04 22:53:18 【问题描述】:

我的语言环境是 :de,我喜欢这样:

Sheet.model_name.human.pluralize # => Belegs

给我添加一个尾随的“e”而不是“s”

Sheet.model_name.human.pluralize # => Belege

仅适用于 Sheet 类。 我可以在我的 config/locales/models/de.yml 中添加它吗?

【问题讨论】:

相关:***.com/q/1185035/1505348 【参考方案1】:

首先,您需要停止使用.pluralize。它使用 Inflector(主要用于 Rails 内部,例如猜测模型表的表名 -> 表)。

Sheet.model_name.human # => "Beleg"
"Beleg".pluralize # => "Belegs"

您应该做的是使用:count 选项。

Sheet.model_name.human(:count => 2) # => "Belege"

这要求您修改您的de.yml

de:

  ...

  activerecord:

    ...

    models:
      sheet:
        one: Beleg
        other: Belege

【讨论】:

看起来不错,我试过但似乎不适用于模型类名称。 我添加了一个解释为什么你不能使用复数形式。变形器并不是为了解决 i18n 问题。 语言环境文件中的模型名称应该是单数,而不是复数(“sheet”,而不是“sheets”)。 @Marcel Jackwerth:只是好奇。在 YAML 文件中,您使用“one”和“other”。 human 函数中是否有等同于“其他”的功能(例如 Sheet.model_name.human(:count => lots)?如果可以有数百个条目,那么将 2 放在那里似乎很奇怪.. @Shawn 实际上你可以使用100000 或任何你想要的。使用:count => "foo" 也将查找other 翻译。当前的实现只检查:zero if count == 0count == 1 ? :one : :other。这是full code。【参考方案2】:

您可以通过这种方式覆盖复数形式:

config/initializers/inflections.rb

做:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular 'Beleg', 'Belege'
end

【讨论】:

【参考方案3】:

如果您不喜欢明确的计数(例如 2),您可以使用 :many 例如

Sheet.model_name.human(count => :many)

或没有哈希火箭(对于 Ruby >= 1.9):

Sheet.model_name.human(count: :many)

【讨论】:

哈希表示法与 Rails 无关。 Ruby 1.9 附带了新语法。 我不知道。谢谢。 明确地说,:many 并不特别。除非您传入1,否则它将始终选择:other,例如Sheet.model_name.human(count: :awesome)

以上是关于覆盖rails3中模型名称的默认复数的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中覆盖默认用户模型后无法登录

覆盖静态类函数的默认 SWIG 名称

Ruby on Rails 复数模型名称

在 EntityFramework Code First 迁移中覆盖“dbo”模式名称

在 cakePHP 上使用单数和复数模型名称访问模型的差异

覆盖UIManagedDocument中的managedObjectModel