質問のこの部分:
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:dump
db:schema:dump
の代わりに -
db:structure:load
db:schema:load
の代わりに
他のすべては同じように機能するはずです。
このアプローチでは、ActiveRecordが理解できないデータベース内の他のものを使用することもできます:CHECK制約、トリガー、単純でない列のデフォルト、...