RailsでRubyに基づいてプロジェクトを開始しています。以前はPerlとPostgreSQLの関数を使用し、Railsと私が見たことがないActiveRecordを使用していました。 PostgreSQLで関数を作成し、ActiveRecordとモデルでレコードを保持する方法。
PostgreSQLで手動で作成できることは知っていますが、Active Recordの「魔法」は、すべてのモデルでデータベースを再作成できることです。
Railsを使用してPostgreSQL関数を作成し、モデルに保持する方法はありますか?
あなたの質問のこの部分:
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
ActiveRecordは関数の作成を逆にするどころか適用する方法がわからないため、単一のup
メソッドではなく、別々のdown
メソッドとchange
メソッドを使用する必要があります。そして、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制約、トリガー、単純でない列のデフォルト、...
唯一の要件がRailsアプリのどこかに作成することである場合、これはActiveRecord::Base.connection.execute
を介して可能であり、生のSQLクエリを実行するために使用できます。
stmt = 'CREATE FUNCTION...'
ActiveRecord::Base.connection.execute stmt
次に、ActiveRecord::Base.connection.execute
を使用して関数を呼び出します(これを処理するメソッドがモデルにあると思います)。