Ruby1.9 で ActiveRecord の serialize が動かない

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

This entry was posted in Rails, Ruby. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>