Rails でモデルのインスタンスを作る際、Hash を渡すことでキーに対応する属性に値を設定してくれます。
といった具合。
しかし、date_select 等を使用した場合、下記のようになる。
これは別に 1i が 年、2i が月、3i が日にマッピングされているわけではなく、もっと汎用的なロジックになっている。
詳しくは、ActiveRecoede::Base のソースを追ってもらえば判るのだが、だいたい下記の流れになっている。
まずパラメータ名の ( の前までが属性名になる。
()内は数値+アルファベット1文字が想定されている。
数値を基準にソートし、引数の順番とする。(ポジションではない)
to_[アルファベット1文字] でパラメータ値を型変換する。
つまり、params = { "date(1i)" => "2009", "date(2i)" => "9", "date(3i)" => "20" } の場合、date が属性名になり、1, 2, 3 の順に引数とされ、to_i で変換された物がコンストラクタに渡される。
汎用的にできているので手動でいじってみる。
1 からじゃなく 2 からやってみる
params = {"date(2i)"=>"2001", "date(3i)"=>"9", "date(4i)"=>"21"}
date: 2001-09-21
こんな風に文字列クラスを拡張して、下記のパラメータを渡してみる
params = {"date(1x)"=>"red", "date(2y)"=>"blue", "date(3z)"=>"yellow"}
date: 2001-09-22
想定通りである。
しかし、to_[アルファベット1文字]って形式は to_s, to_i, to_a ぐらい。
to_s は意味がないし、String#to_a してもまた文字列にされるのでこれまた無意味。
String に to_r, to_g, to_b なんかを作って、カラーコードを取り扱うって事ぐらいならできるかも知れませんね。