web-dev-qa-db-ja.com

RailsのRuby)にPostgreSQL関数を記述できますか?

RailsでRubyに基づいてプロジェクトを開始しています。以前はPerlとPostgreSQLの関数を使用し、Railsと私が見たことがないActiveRecordを使用していました。 PostgreSQLで関数を作成し、ActiveRecordとモデルでレコードを保持する方法。

PostgreSQLで手動で作成できることは知っていますが、Active Recordの「魔法」は、すべてのモデルでデータベースを再作成できることです。

Railsを使用してPostgreSQL関数を作成し、モデルに保持する方法はありますか?

17
MaxJRB

あなたの質問のこの部分:

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

しかし、updownよりもノイズが多いことがわかりました。

ただし、schema.rbおよびschema.rbで動作する通常のRakeタスク(db:schema:loaddb:schema:dumpなど)は、PostgreSQL関数やその他のActiveRecordの処理方法を認識しません。理解していません。これを回避する方法はありますが、次のように設定することで、structure.sqlの代わりにschema.rbファイルを使用することを選択できます。

config.active_record.schema_format = :sql

config/application.rbファイル内。その後、db:migratedb/structure.sqlの代わりにdb/schema.rbファイル(データを含まないPostgreSQLデータベースの生のSQLダンプ)を書き込みます。また、structure.sqlを操作するためにさまざまなRakeタスクを使用します。

  • db:structure:dumpの代わりにdb:schema:dump
  • db:structure:loadの代わりにdb:schema:load

他のすべては同じように機能するはずです。

このアプローチでは、ActiveRecordが理解できないデータベース内の他のものを使用することもできます:CHECK制約、トリガー、単純でない列のデフォルト、...

33
mu is too short

唯一の要件がRailsアプリのどこかに作成することである場合、これはActiveRecord::Base.connection.executeを介して可能であり、生のSQLクエリを実行するために使用できます。

stmt = 'CREATE FUNCTION...'
ActiveRecord::Base.connection.execute stmt

次に、ActiveRecord::Base.connection.executeを使用して関数を呼び出します(これを処理するメソッドがモデルにあると思います)。

0
Sculper