PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Kann ich PostgreSQL-Funktionen auf Ruby on Rails schreiben?

Dieser Teil Ihrer Frage:

Ich weiß, dass wir es manuell in PostgreSQL erstellen können, aber das „Magische“ mit Active Record ist, dass die Datenbank mit allen Modellen neu erstellt werden kann.

sagt mir, dass Sie wirklich nach einer Möglichkeit suchen, PostgreSQL-Funktionen in den normalen Rails-Migrationsprozess und Rake-Aufgaben wie db:schema:load zu integrieren .

Das Hinzufügen und Entfernen von Funktionen in Migrationen ist einfach:

def up
  connection.execute(%q(
    create or replace function ...
  ))
end

def down
  connection.execute(%q(
    drop function ...
  ))
end

Sie müssen ein separates up verwenden und down Methoden anstelle einer einzelnen change Methode, da ActiveRecord keine Ahnung hat, wie man eine Funktionserstellung anwendet, geschweige denn umkehrt. Und Sie verwenden connection.execute um die rohe Funktionsdefinition an PostgreSQL zu übergeben. Sie können dies auch mit einem reversible tun innerhalb von 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

aber ich finde das lauter als up und down .

Allerdings schema.rb und die üblichen Rake-Tasks, die mit schema.rb arbeiten (z. B. db:schema:load und db:schema:dump ) weiß nicht, was mit PostgreSQL-Funktionen und anderen Dingen zu tun ist, die ActiveRecord nicht versteht. Es gibt jedoch einen Weg, dies zu umgehen, Sie können wählen, ob Sie eine structure.sql verwenden möchten Datei anstelle von schema.rb durch Einstellung:

config.active_record.schema_format = :sql

in Ihrer config/application.rb Datei. Danach db:migrate schreibt eine db/structure.sql Datei (die nur ein roher SQL-Dump Ihrer PostgreSQL-Datenbank ohne Ihre Daten ist) anstelle von db/schema.rb . Sie werden auch verschiedene Rake-Aufgaben für die Arbeit mit structure.sql verwenden :

  • db:structure:dump statt db:schema:dump
  • db:structure:load statt db:schema:load

Alles andere sollte genauso funktionieren.

Mit diesem Ansatz können Sie auch andere Dinge in Ihrer Datenbank verwenden, die ActiveRecord nicht versteht:CHECK-Einschränkungen, Trigger, nicht einfältige Spaltenvorgaben, ...