フォーチュンサモナーズ
«前の日記(2008-05-16) 最新 次の日記(2008-05-23)» 編集

Don'tStopMusic

2003|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|12|
2006|01|02|03|04|05|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|09|10|

カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年

知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。


2008-05-20

_ [Rails] 特定のデータベース依存なmigrationスクリプトを他のデータベースでも動作するように書く良い方法はないかな このエントリーを含むブックマーク

はてなで質問して諦めた件です。データベースに Tritonn 使っているときは Senna の全文検索が有効だけれども、SQLite などでも一応動作するという Rails アプリを作ろうとしています。

Tritonn (MySQL+Senna) で全文検索するには、テーブルを MyISAM で作成しなくてはなりません。Rails の migration はデフォルトでテーブルを InnoDB にするので、create_table の引数で MyISAM を指定してやる必要があります。そうすると必然的に MySQL でしか動かない migration になります。

とりあえずどうしたかといいますと、きれいな書き方ではないですが、ActiveRecord::Base.connection.adapter_name を使って MySQL の時だけ options を指定するようにしました。

例えば、記事テーブルを全文検索対象にするなら、以下のような migration クラスになります。

class CreateEntries < ActiveRecord::Migration
  def self.up
    options = {}
    if ActiveRecord::Base.connection.adapter_name == 'MySQL'
      options = { :options => 'ENGINE=MyISAM DEFAULT CHARSET=utf8' }
    end
    create_table :entries, options do |t|
      t.text title, body
      t.timestamps
    end
  end
 
  def self.down
    drop_table :entries
  end
end

さらに全文検索用のインデックス作成なども必要に応じて分岐しますが、もうちょっと抽象度の高い書き方にならないものかなと思います。

あと、MyISAM を使うと Rails に MyISAM エンジンは向いてないと思った次第 で書いたような問題も発生します。うーん。そもそも Senna じゃない全文検索エンジンを使うべきなのかも……

_ [ネットサービス] 読書メーター に登録してみた このエントリーを含むブックマーク

読書メーターは、

最近読んだ本のページ数や冊数をグラフにしてあなたの読書量を記録・管理するwebサービスです。

本は数を読めばいいってものじゃないですが、自分がどのくらいのペースで読んでいるか把握しておくのはいいですね。

お名前:
E-mail:
コメント:
[]

最近のコメント:

RSS
Creative Commons License
This work is licensed under a Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).