Ruby on Rails で SEQUENCE を使うには

PostgreSQLの SEQUENCE を使う必要が出てきたので、調べてみましたが ActiveRecordには直接 SEQUENCE を使うAPI等はありませんでしたが比較的簡単に使えました。

http://www.postgresql.org/layout/images/hdr_left.png

Migration

Migration機能には create_sequence のようなAPI はありませんが以下のようにexecuteを使ってRDB独自のSQLを実行できます。

class XxxxxSequence < ActiveRecord::Migration
  def self.up
    execute "CREATE SEQUENCE xxxxx_seq"
  end

  def self.down
    execute "DROP SEQUENCE xxxxx_seq"
  end
end

ただし、テスト用DBを作る rake db:test:prepare では SEQUENCEは作られませんでした

SEQUENCE の利用

これは、ActiveRecord::ConnectionAdapters::DatabaseStatements を使うと任意のSQL文が実行できるので、これで解決です

seq =  connection.select_value("select nextval('xxxxx_seq')")

ちなみに select_value の戻り値は 文字列まはた nil のようです。