読者です 読者をやめる 読者になる 読者になる

schema.rbじゃなくてstructure.sqlでスキーマ情報を管理しよう

先日開催された関西Ruby会議05に参加された方お疲れ様でした。色々な方とお話出来て非常に楽しい1日でした。
さて、「No Sugar 〜私はどのようにしてRails開発に貢献したか〜」という発表をされた @kennyj_jp さんから懇親会で面白い話を聞くことができました。

schema.rbでスキーマ情報を管理するのは限界があるのではないか?

先日私がリリースしたpg_index_where について失礼ながら意見を聞いてみました。ポイントはスキーマ情報をdumpする処理について現在の実装方法で正しいのかという点。
そもそもユニークインデックスにwhereを付けるようなRDB固有の命令については、Rails標準のschema.rbで管理し続けるのは限界があるのではないかというお話でした。

Railsの設定でdump方法を変更できる

次のようにapplication.rbの一部をコメントアウトするとschema.rbではなくstructure.sqlというSQL文が出力されるようになります。

    # Use SQL instead of Active Record's schema dumper when creating the database.
    # This is necessary if your schema can't be completely dumped by the schema dumper,
    # like if you have constraints or database-specific column types
    config.active_record.schema_format = :sql

ちょっと動きを確認してみましたがcreate indexにwhereを付けた場合も正しくSQLが作成されてました(あたりまえか)。
このオプションを有効にした場合、元々あったschema.rbは削除してもよさそうです。

使用しているRDB固有のスキーマ定義を設定してて、schema.rbに正しく出力されないとお嘆きの方は設定を変更することをオススメします。