Module Inflector
In: vendor/rails/activesupport/lib/active_support/inflector.rb

The Inflector transforms words from singular to plural, class names to table names, modularized class names to ones without, and class names to foreign keys.

Methods

Public Instance methods

Adds absolute maps between table names and classes. For example,

  add_table_class_relationships 'MyFirstModel' => 'table1', 'MyModelTwo' => 'table2'

When defined, tableize and classify will return these relationships instead of guessed ones. Specifying nil for a table name will remove the absolute map for a given class

[Source]

    # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 68
68:   def add_table_class_relationships(*defs)
69:     @class_to_table_name = Hash::new if @class_to_table_name.nil?
70: 
71:     # Assume all mappings will be 1-1
72:     defs.each do |d|
73:       d.each_pair do |class_name,table_name|
74:         if table_name
75:           @class_to_table_name[class_name] = table_name
76:         else
77:           @class_to_table_name.delete class_name
78:         end
79:       end
80:     end
81:     @class_to_table_name.rehash
82:     @table_to_class_name = @class_to_table_name.invert
83:   end

[Source]

    # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 28
28:   def camelize(lower_case_and_underscored_word)
29:     lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
30:   end

[Source]

    # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 54
54:   def class_table_relationship?(class_name)
55:     !@class_to_table_name.nil? and @class_to_table_name.member? class_name
56:   end

[Source]

    # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 49
49:   def classify(table_name)
50:     return @table_to_class_name[table_name] if table_class_relationship? table_name
51:     camelize(singularize(table_name))
52:   end

[Source]

    # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 90
90:   def constantize(camel_cased_word)
91:     camel_cased_word.split("::").inject(Object) do |final_type, part| 
92:       final_type = final_type.const_get(part)
93:     end
94:   end

[Source]

    # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 40
40:   def demodulize(class_name_in_module)
41:     class_name_in_module.to_s.gsub(/^.*::/, '')
42:   end

[Source]

    # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 85
85:   def foreign_key(class_name, separate_class_name_and_id_with_underscore = true)
86:     Inflector.underscore(Inflector.demodulize(class_name)) + 
87:       (separate_class_name_and_id_with_underscore ? "_id" : "id")
88:   end

[Source]

    # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 36
36:   def humanize(lower_case_and_underscored_word)
37:     lower_case_and_underscored_word.to_s.gsub(/_/, " ").capitalize
38:   end

[Source]

    # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 6
 6:   def pluralize(word)
 7:     result = word.to_s.dup
 8: 
 9:     if uncountable_words.include?(result.downcase)
10:       result
11:     else
12:       plural_rules.each { |(rule, replacement)| break if result.gsub!(rule, replacement) }
13:       result
14:     end
15:   end

[Source]

    # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 17
17:   def singularize(word)
18:     result = word.to_s.dup
19: 
20:     if uncountable_words.include?(result.downcase)
21:       result
22:     else
23:       singular_rules.each { |(rule, replacement)| break if result.gsub!(rule, replacement) }
24:       result
25:     end
26:   end

[Source]

    # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 58
58:   def table_class_relationship?(table_name)
59:     !@table_to_class_name.nil? and @table_to_class_name.member? table_name
60:   end

[Source]

    # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 44
44:   def tableize(class_name)
45:     return @class_to_table_name[class_name] if class_table_relationship? class_name
46:     pluralize(underscore(class_name))
47:   end

[Source]

    # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 32
32:   def underscore(camel_cased_word)
33:     camel_cased_word.to_s.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z])/,'\1_\2').gsub(/([a-z\d])([A-Z])/,'\1_\2').downcase
34:   end

Private Instance methods

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 101
101:     def plural_rules #:doc:
102:       [
103:         [/^(ox)$/i, '\1\2en'],                        # ox
104:         [/([m|l])ouse$/i, '\1ice'],                 # mouse, louse
105:         [/(matr|vert)ix|ex$/i, '\1ices'],      # matrix, vertex, index
106:         [/(x|ch|ss|sh)$/i, '\1es'],            # search, switch, fix, box, process, address
107:         [/([^aeiouy]|qu)ies$/i, '\1y'],
108:         [/([^aeiouy]|qu)y$/i, '\1ies'],        # query, ability, agency
109:         [/(hive)$/i, '\1s'],                   # archive, hive
110:         [/(?:([^f])fe|([lr])f)$/i, '\1\2ves'], # half, safe, wife
111:         [/sis$/i, 'ses'],                      # basis, diagnosis
112:         [/([ti])um$/i, '\1a'],                 # datum, medium
113:         [/(p)erson$/i, '\1eople'],             # person, salesperson
114:         [/(m)an$/i, '\1en'],                   # man, woman, spokesman
115:         [/(c)hild$/i, '\1hildren'],            # child
116:         [/(buffal|tomat)o$/i, '\1\2oes'],                   # buffalo, tomato
117:         [/(bu)s$/i, '\1\2ses'],                 # bus
118:         [/(alias)/i, '\1es'],                  # alias
119:         [/(octop|vir)us$/i, '\1i'],            # octopus, virus - virus has no defined plural (according to Latin/dictionary.com), but viri is better than viruses/viruss
120:         [/(ax|cri|test)is$/i, '\1es'],         # axis, crisis  
121:         [/s$/i, 's'],                          # no change (compatibility)
122:         [/$/, 's']
123:       ]
124:     end

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 126
126:     def singular_rules #:doc:
127:       [
128:         [/(matr)ices$/i, '\1ix'],
129:         [/(vert)ices$/i, '\1ex'],
130:         [/^(ox)en/i, '\1'],
131:         [/(alias)es$/i, '\1'],
132:         [/([octop|vir])i$/i, '\1us'],
133:         [/(cris|ax|test)es$/i, '\1is'],
134:         [/(shoe)s$/i, '\1'],
135:         [/(o)es$/i, '\1'],
136:         [/(bus)es$/i, '\1'],
137:         [/([m|l])ice$/i, '\1ouse'],
138:         [/(x|ch|ss|sh)es$/i, '\1'],
139:         [/(m)ovies$/i, '\1\2ovie'],
140:         [/(s)eries$/i, '\1\2eries'],
141:         [/([^aeiouy]|qu)ies$/i, '\1y'],
142:         [/([lr])ves$/i, '\1f'],
143:         [/(tive)s$/i, '\1'],
144:         [/(hive)s$/i, '\1'],
145:         [/([^f])ves$/i, '\1fe'],
146:         [/(^analy)ses$/i, '\1sis'],
147:         [/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i, '\1\2sis'],
148:         [/([ti])a$/i, '\1um'],
149:         [/(p)eople$/i, '\1\2erson'],
150:         [/(m)en$/i, '\1an'],
151:         [/(s)tatus$/i, '\1\2tatus'],
152:         [/(c)hildren$/i, '\1\2hild'],
153:         [/(n)ews$/i, '\1\2ews'],
154:         [/s$/i, '']
155:       ]
156:     end

[Validate]