2012年3月13日火曜日

文字コードを変換する方法

今回のプロジェクトは既に昔から動いているperlで出来たHPの管理システム。
mysqlの文字コードはlatin1を使用していてテンパったのでここにメモ

database.ymlを書く

development:
  adapter: mysql2
  encoding: latin1
  database: データベース名
  pool: 5
  username: ユーザー名
  password: パスワード

データベースを作る

  • 今回は既存のデータに追加する形で使う
  • データベースのテーブル名は大文字である
  • 必要なデータだけdevelopmentで再現する
$ rails g model user

class CreateUsers < ActiveRecord::Migration
  def change
    if Rails.env.production?
      add_column :USER, :advertisement, :text
      add_column :USER, :created_at, :datetime
      add_column :USER, :updated_at, :datetime
    else
      create_table :USER do |t|
        t.string :NAME
        t.string :PREF
        t.string :ADDRESS
        t.string :EMAIL
        t.string :TEL
        t.text   :advertisement #今回追加する部分
 
        t.timestamps
      end
    end
  end
end

今回は1つデータベースに追加する形なので小文字がRailsプロジェクトで作成したカラムである。他は開発環境で再現する為に作った開発環境のみのDB。
またRAILS_ENVの時は「add_column」で「USER」テーブルに追加する

次にモデルの編集

class User < ActiveRecord::Base
  self.table_name = "USER" #このままだとseedに挿入出来ないのでテーブル名を指定する。

  attr_accessor :ad, :pref, :address, :name # カラム名を変換

  after_find do # 変換する
    self.pref = self.PREF ? NKF.nkf("-Ew", self.PREF) : ""
    self.ad = self.advertisement ? NKF.nkf("-Ew", self.advertisement) : ""
    self.address = self.ADDRESS ? NKF.nkf("-Ew", self.ADDRESS) : ""
    self.name = self.NAME ? NKF.nkf("-Ew", self.NAME) : ""
  end

  before_save do
    self.PREF = NKF.nkf("-eW", self.pref) if self.pref
    self.ADDRESS = NKF.nkf("-eW", self.address) if self.address
    self.NAME = NKF.nkf("-eW", self.name) if self.name
    self.advertisement = NKF.nkf("-eW", self.ad) if self.ad
  end
end

seedを作成する
中身は以下の通りである。「attr_accessor」で指定したカラム名に変更
テキスト内容は以下の様にして外部ファイルを読み込む

pref = ["北海道","東京都","神奈川県","愛知県","大阪府","福岡県","沖縄県"]
0.upto(200) do |idx|
  User.create!(
    :name => "団体名第 #{idx}",
    :pref => "#{pref[idx % 7]}",
    :address => "#{pref[idx % 7]}",
    :EMAIL => "mail#{idx}@example.com",
    :TEL => "00-1234-5678",
    :ad => File.read(Rails.root.join("db/seeds/advertisement.txt"))
  )
end

あとはcontrollerを設定すれば表示されるはずです。「次は都道府県別に表示する」をメモします。

0 件のコメント:

コメントを投稿