Categories
open all | close allTags
Flash | タグ | rake | 国際化 | 認証 | アクセス制御 | スキンエンジン | デュアル・コア | Subversion | ドキュメント | パソコン | 名称 | Aptana | CSRF | モデル | テスト | RESTful | JustPosted | Migration | フォームSearch
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つにまとめてしまうことも可能ですが,このように段階を追って作っておいたほうがメンテナンスは楽になりそうです。
Comments
No comments yet. You can be the first!