PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Posso scrivere funzioni PostgreSQL su Ruby on Rails?

Questa parte della tua domanda:

So che possiamo crearlo manualmente in PostgreSQL, ma la "magia" con Active Record è che il database può essere ricreato con tutti i modelli.

mi dice che stai davvero cercando un modo per integrare le funzioni PostgreSQL con il normale processo di migrazione di Rails e le attività Rake come db:schema:load .

Aggiungere e rimuovere funzioni nelle migrazioni è facile:

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

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

Devi utilizzare up separato e down metodi invece di una singola change metodo perché ActiveRecord non avrà idea di come applicare e tanto meno invertire la creazione di una funzione. E usi connection.execute per inviare la definizione della funzione grezza a PostgreSQL. Puoi farlo anche con un reversible dentro 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

ma lo trovo più rumoroso di up e down .

Tuttavia, schema.rb e le solite attività di Rake che funzionano con schema.rb (come db:schema:load e db:schema:dump ) non saprà cosa fare con le funzioni PostgreSQL e altre cose che ActiveRecord non comprende. C'è un modo per aggirare questo problema, puoi scegliere di usare un structure.sql file invece di schema.rb impostando:

config.active_record.schema_format = :sql

nel tuo config/application.rb file. Successivamente, db:migrate scriverà un db/structure.sql file (che è solo un dump SQL grezzo del tuo database PostgreSQL senza i tuoi dati) invece di db/schema.rb . Utilizzerai anche diverse attività di Rake per lavorare con structure.sql :

  • db:structure:dump invece di db:schema:dump
  • db:structure:load invece di db:schema:load

Tutto il resto dovrebbe funzionare allo stesso modo.

Questo approccio ti consente anche di utilizzare altre cose nel tuo database che ActiveRecord non comprende:CONTROLLA vincoli, trigger, impostazioni predefinite di colonna non semplicistiche, ...