質問のこの部分:
PostgreSQLで手動で作成できることは知っていますが、Active Recordの「魔法」は、すべてのモデルでデータベースを再作成できることです。
PostgreSQLの関数を通常のRails移行プロセスやdb:schema:loadなどのRakeタスクと統合する方法を本当に探していると教えてくれます。 。
移行での関数の追加と削除は簡単です:
def up
connection.execute(%q(
create or replace function ...
))
end
def down
connection.execute(%q(
drop function ...
))
end
別のupを使用する必要があります およびdown 単一のchangeの代わりにメソッド ActiveRecordは、関数の作成を逆にするどころか、どのように適用するかわからないためです。そして、connection.executeを使用します 生の関数定義をPostgreSQLにフィードします。 reversibleを使用してこれを行うこともできます change内 :
def change
reversible do |dir|
dir.up do
connection.execute(%q(
create or replace function ...
))
end
dir.down do
connection.execute(%q(
drop function ...
))
end
end
end
しかし、upよりもノイズが多いことがわかりました およびdown 。
ただし、schema.rb およびschema.rbで機能する通常のRakeタスク (db:schema:loadなど およびdb:schema:dump )PostgreSQL関数やActiveRecordが理解できないその他のことをどうするかわかりません。これを回避する方法はありますが、structure.sqlを使用することを選択できます schema.rbの代わりにファイル 設定による:
config.active_record.schema_format = :sql
config/application.rbで ファイル。その後、db:migrate db/structure.sqlを書き込みます db/schema.rbの代わりにファイル(データを含まないPostgreSQLデータベースの生のSQLダンプ) 。また、structure.sqlを操作するためにさまざまなRakeタスクを使用します :
-
db:structure:dumpdb:schema:dumpの代わりに -
db:structure:loaddb:schema:loadの代わりに
他のすべては同じように機能するはずです。
このアプローチでは、ActiveRecordが理解できないデータベース内の他のものを使用することもできます:CHECK制約、トリガー、単純でない列のデフォルト、...