scramble cadenza

技術ネタのガラクタ置き場

サンタさんたち? ~サンタの複数形~

イントロ

クリスマスネタ。職場のある日常。

時期が時期だし、クリスマスネタを盛り込んだ 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

まとめ

サンタは単数形 である。
(一応ロシア語とかフランス語とかドイツ語も調べてみたけれど、サンタの複数形が存在するかはわからず。わからないってことは存在しない?)