如何覆盖Rails的命名约定?

76

我有一个名为"clothing"的模型,希望它成为单数形式(一件衣服)。默认情况下,Rails将其复数形式设定为"clothings"。无论对错,我认为如果复数形式是"clothes"会更易读。

我该如何重写复数命名规则?我能否在模型中直接进行操作,以免反复修改?这将如何改变路由的处理方式(我正在使用RESTful架构)?


10
改变你的模型,使用"garment"和"garments"这两个词。 - Rich Seller
相关链接:https://dev59.com/P2025IYBdhLWcg3wKSiP - Lucio
4个回答

129

我不是 RoR 专家,但找到了一个可能的方法。从参考网站中,您可以在config/initializers/inflections.rb文件中添加变形规则:

# Add new inflection rules using the following format 
ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular 'clothing', 'clothes'
end

45
实际上,您自定义的语法变形应该位于config/initializers/inflections.rb中。 - Aaron Rustad
3
如果您和我一样有点懒,可以这样做:ActiveSupport::Inflector.inflections do |inflect|,如果它找不到Inflector。 - Abe Petrillo
我喜欢你的方法。如果我有很多“自定义”变形,我会将它们保存在yaml文件中,并在同一档案中加载该文件。 - Aldana
1
如果传递了可选的语言环境参数,可以指定其他语言的规则。如果未指定,则默认为 :en,这将提供英语语言的规则。 ActiveSupport::Inflector.inflections(:en) - Sree Raj

28

对于Rails 2.3.2或更高版本,您需要进行一些不同的操作:

ActiveSupport::Inflector.inflections do |inflect|
    inflect.plural /^(ox)$/i, '\1\2en'
    inflect.singular /^(ox)en/i, '\1'

    inflect.irregular 'octopus', 'octopi'

    inflect.uncountable "equipment"
end

5
如果你想停止数据库的复数形式,可以在environment.rb文件中添加以下内容:
ActiveRecord::Base.pluralize_table_names = false

-1

对于我来说,使用Ruby 2.2.2的Windows或Linux最好的解决方案是:

ActiveRecord::Base.pluralize_table_names = false

class Persona < ActiveRecord::Base
end


personas = Persona.all
personas.each do | personita |
  print "#{personita.idpersona}   #{personita.nombre}\n"
end

p Persona.count

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接