データベースがSJIS

ずーっと書こう書こうと思っていて忘れていた(汗

Rails 2.1 で Shift-JIS」という記事に、今でも結構アクセスあるようなので、書いておきます。

データベース*だけ*SJISなのであれば、モデルの attr,attr= をオーバーライドしてその中でUTF-8SJISの変換をした方が良いと思います。そうすれば、テンプレートもソースコードUTF-8で書けるので。

確認していないですが、
(1. twitterで中田さんに、SJIS.includedの中あたりでHogeModelにやらせないと無意味というか、いろいろエラーになりそうと指摘を受けたのでちょっと変更。相変わらず実際に動かしては試してない)
(2. includeじゃなくてextendっぽい。)

lib/sjis.rb:

require 'nkf'

module SJIS

  def self.extended(klass)
    klass.columns.each do |c|
      next unless [:string, :text].include?(c.type)

      define_method c.name do
        NKF.nkf("-Sw -m0", read_attribute(c.name))
      end

      define_method "#{c.name}=" do |val|
        write_attribute(c.name, NKF.nkf("-Ws -m0", val))
      end
    end
    super
  end

end
class HogeModel < ActiveRecord::Base
  extend SJIS
end

みたいにすればいいんじゃないかと思います。


config/database.rb の encoding: sjis も必要かな?

完動品ができたらトラックバックもらえるとありがたいです。