Rails+SQL Serverの文字コード対策

環境

Ruby 1.8.7p302
Rails 2.3.10
DB SQL Server

文字コード

クライアント(ブラウザ) UTF-8
DB CP932
$KCODEとWIN32OLE

config/environment.rb に次のような設定をしたが、更新時にエラーになる。

$KCODE = "u"
require "win32ole"
WIN32OLE.codepage=WIN32OLE::CP_UTF8




エラーメッセージのコピペ

ODBC::Error: 37000 (105) [Microsoft][SQL Native Client][SQL Server]Unclosed quotation mark after the character string '�E�010年ももぁE��ぐ終わめE)'.: INSERT INTO [kamis] ([naiyou], [created_at], [updated_at], [odai]) VALUES(N'大晦日も仕事(;ω;)', '2010-12-30 21:50:58.594', '2010-12-30 21:50:58.594', N'2010年ももうすぐ終わり')

参考:
http://yugui.jp/articles/572
SQL Serverを使う - azuki note


参考にしたページでは上手いこといくらしい。。。
自分の環境ではエラーになっちゃうのは何故?

Modelのコールバックを使う

Model の コールバックで変換を行うことでエラーにならないようになった。

class Kami < ActiveRecord::Base
  
  def after_find
    self.odai = Iconv.conv("UTF-8", "CP932", self.odai)
    self.naiyou = Iconv.conv("UTF-8", "CP932", self.naiyou)
  end

  def before_save
    self.odai = Iconv.conv("CP932", "UTF-8", self.odai) if self.odai_changed?
    self.naiyou = Iconv.conv("CP932", "UTF-8", self.naiyou) if self.naiyou_changed?
  end

end


参考:
Ruby on Rails - Tips - かえるの尻尾
ActiveRecord::Callbacks
http://blog.mizzy.org/articles/2005/12/30/learningRails06
after_initializeに関して - カノ エ ノ メモ - cucumberグループ
http://jror4883.rubyforge.org/svn/trunk/activerecord/lib/active_record/callbacks.rb