Migrationをまじめに書く

このところ何をしていたかというと,スキン・エンジンの抽象化作業の残りを続けていました。
具体的にはMigrationを書くところ。これまではNucleusのテーブルそのものしか使っていなかったので,実はMigrationを全然書いていなかったのですが,ここで新しいテーブルを導入するためにどうしても必要になったのです。

書いてみるとなかなか楽しい。Nucleusのアップグレードスクリプト相当のものが簡単にできてしまいます。

ちなみに,スキン・エンジンに関係するところは次のよう。

  def self.up
    create_table :skin_engines do |t|
      t.string :klass_name
    end
    
    newengine = SkinEngines.new
    newengine.klass_name = 'Skin'
    newengine.save
    
    create_table :skins do |t|
      t.string :skin_name
      t.integer :skin_engine
    end

    add_column :blog, :bskinid, :integer

    engines = SkinEngines.find(:all)
    blogs = Blog.find(:all)
    engines.each do |engine|
      engine.klass_name.constantize.find_skins.each do |skin|
        s = Skins.new
        s.skin_name = skin.name
        s.skin_engine = engine.id
        s.save
        blogs.each do |b|
          if b.oldskin.sdname == skin.name
            b.bskinid = s.id
            b.save
          end
        end
      end
    end
  end

初めにスキン・エンジンのテーブルを作っていますが,ここは実際にパースを行うクラスをのフィールドだけというシンプルなものです。ついでにデフォルトのSkinクラスを最初のアイテムとして登録しています。

次のskinsのテーブルは抽象化されたスキンのクラス。つまり,いろいろなエンジンのスキンを一緒くたに登録するためのテーブルです。ここではスキンの名前とエンジンのIDのフィールドがあります。

次に,blogテーブルにbskinidというフィールドを加えています。これは今作った抽象化スキンのIDを入れるフィールドです。既にあるbdefskinフィールドを使ってもいいのですが,それだとNucleusとのテーブルの共存ができなくなるため,別フィールドを加えました。

次に,既にスキンの登録が各エンジンにある場合,これを新しいテーブルに登録していく作業をしています。ブログのデフォルトスキンを新しく作ったフィールドに加える作業もここでします。

Migrationは全部1つにまとめてしまうことも可能ですが,このように段階を追って作っておいたほうがメンテナンスは楽になりそうです。


« Prev item - Next Item »
---------------------------------------------

Comments


No comments yet. You can be the first!


Leave comment

© 2007 yoursite.com | Designed by DesignsByDarren
Ported to Nucleus CMS: Suvoroff