サンタさんたち? ~サンタの複数形~
イントロ
クリスマスネタ。職場のある日常。
時期が時期だし、クリスマスネタを盛り込んだ rails アプリを作成しようと思い立った。
その名も「santa」という名前のアプリ。(ひねり無し)
’santa’ という文字列を与えて、そこからクラスを作成するときに起きた悲劇がこちら。
rails の処理
'santa'.singularize => "santum" 'santa'.pluralize => "santa" 'santa'.classify => "Santum"
- String#singularizeで単数形に
- String#pluralizeで複数形に
- String#classify でクラス名に
するメソッド。
通常なら文字列からクラスを作成するときは、ActiveRecord を使って classify メソッド、constantize メソッドを呼べば良いのです。
'item'.classify.constantize #=> Item
けどうまくいかない場合もある。
何故かと言うと
String#classify は内部的に単数形に変換を行ってからクラス名を作る
からです。
def classify(table_name) # strip out any leading schema name camelize(singularize(table_name.to_s.sub(/.*\./, ''))) end
ですから Santa というクラスを作りたいのに、Santum というクラスが作られてしまうということに...
'santa'.classify.constantize #=> Santum
というかサンタって暗黙的に複数形だったんだーとカルチャーショックを受けて、少し調べてみました。
アメリカだとサンタって複数人いるって伝えられていて、子供が「一人のサンタさん」と言いたいときは "santum" と言うのだろうか?
結論
サンタは複数系じゃありませんでした。
デフォルトの ActiveSupport::Inflector で自動的にこうなってしまうそうです。
変換を除外したい場合、config/initializers/inflections.rb に配列で追加すればよい。
Inflector.inflections do |inflect| inflect.uncountable %w( santa ) end
'santa'.classify.constantize #=> Santa
まとめ
サンタは単数形 である。
(一応ロシア語とかフランス語とかドイツ語も調べてみたけれど、サンタの複数形が存在するかはわからず。わからないってことは存在しない?)