如何覆盖Rails的命名约定?


74

我有一个名为“ clothing”的模型,我想成为单数(一件衣服)。默认情况下,rails说复数是服装。对或错,我认为如果复数为“衣服”,则可读性更高。

如何覆盖复数命名约定?我可以在模型中正确执行此操作,而不必一遍又一遍地执行吗?这将如何改变路由的处理方式(我正在使用静态架构)?


10
如何将模型更改为成衣呢?
Rich Seller

Answers:


126

我不是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 2009年

3
对于那些像我这样懒惰的人:ActiveSupport::Inflector.inflections do |inflect|如果找不到它本身就是Inflector
安倍·

我喜欢你的方法。如果我有很多“自定义”变形,则可以将它们保存在yaml中,然后将文件加载到同一存档中。
Aldana

1
如果传递了可选的语言环境,则可以指定其他语言的规则。如果未指定,则默认为:en,它将提供英语规则。 ActiveSupport::Inflector.inflections(:en)
Sree Raj

28

对于Rails 2.3.2以及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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.