ruby1.9 より前のバージョンで DB に ActiveRecord の serialize XXX,Hash を使用して
カラムにデータ保存していたデータを、
ruby1.9 でよみだすと日本語部分が壊滅状態 orz
‘activerecord serialize hash ruby1.9′ で検索して
http://stackoverflow.com/questions/10270083/ruby-1-9-migration-with-yaml-serialized-text-fields
YAML::ENGINE.yamler = “syck”
まじですか?
詳細は追っかけていないけど UTF-8 でもないエンコードで読み出すことはなくなった orz
rails アプリのデータ移行ツールを作っていたんですが CentOS 6.3(x86_64) の 1.8 では何の問題もなく動いていたので
ruby1.9 で動かしてみたら動かないところが噴出!!
スクリプト内に UTF-8 の日本語が含まれていてエラーになったのでマジックコメントを追加
http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fm17n.html#magic_comment
スクリプトが実行されるようにはなったが、移行前のチェック段階でなぜかチェックに失敗
ruby1.9 になったため DB との接続が mysql から mysql2 になっているので
そっちのエラーかと思って一生懸命 config[:encoding] などを設定してみるも
“\xEF\xBB\xBF”
のように格納されている文字列が UTF-8 じゃないエンコードで読み出されている orz
しゃーないから ActiveRecord の read_attribute 全部フックデモするかとおもって https://gist.github.com/347335 とか見つけたけど
よくよく調べてみたら serialize している箇所だけっぽいぞ?
それならば serialize を使用せずに YAML の自前デコードを作るかと思って
検索してみるととてつもなくビンゴくさいの見つけたので試したところ動いたwww
よそうとしては、 ruby1.9 で Encoding が追加されたのに対応したが
後方互換がとれていない?
調べていくと
http://doc.ruby-lang.org/ja/1.9.2/library/yaml.html
require “yaml” した場合、特に何もしなければ syck ライブラリを使用します。
http://doc.ruby-lang.org/ja/1.9.3/library/yaml.html
require “yaml” した場合、特に何もしなければ psych ライブラリを使用します。
おい!!!!!ひどすぎるやろ
ruby “YAML::ENGINE.yamler” で検索してみると
http://keijinsonyaban.blogspot.jp/2010/10/ruby192yaml.html
おおう、格納するときに 7BIT 化してたのやめたのかwww
さっすが、「最新が安定してます」と言わしめることがある ruby だわ
しかも最新版に追従しているコンポーネントを使用している限りという注釈まで必要なのは…
rails3 環境が過渡期にあるのはわかるが、自由度が高いおかげもあいまって
バッドノウハウ(クイック八苦)に関してもバージョンの組み合わせ単位で存在している状況www
ただ、これだけの多大なるコストを払いつつも前進していたり heroku やクックパッドのような企業さんもいるので
そのうち rails3 環境はある程度落ち着くと思いたいw
ただ、いにしえの rpm だの deb だの ports だのの騒動再び?って感じで懐かしくはあるがwww