Denne del af dit spørgsmål:
Jeg ved, at vi kan oprette det manuelt i PostgreSQL, men "magien" med Active Record er, at databasen kan genskabes med alle modellerne.
fortæller mig, at du virkelig leder efter en måde at integrere PostgreSQL-funktioner med den normale Rails-migreringsproces og Rake-opgaver såsom db:schema:load .
Det er nemt at tilføje og fjerne funktioner i migreringer:
def up
connection.execute(%q(
create or replace function ...
))
end
def down
connection.execute(%q(
drop function ...
))
end
Du skal bruge separat up og down metoder i stedet for en enkelt change metode, fordi ActiveRecord ikke har nogen idé om, hvordan man anvender endsige vende en funktionsoprettelse. Og du bruger connection.execute at fodre den rå funktionsdefinition til PostgreSQL. Du kan også gøre dette med en reversible inde i 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
men jeg synes, det er mere støjende end up og down .
Men schema.rb og de sædvanlige Rake-opgaver, der fungerer med schema.rb (såsom db:schema:load og db:schema:dump ) ved ikke, hvad de skal gøre med PostgreSQL-funktioner og andre ting, som ActiveRecord ikke forstår. Der er dog en vej rundt om dette, du kan vælge at bruge en structure.sql fil i stedet for schema.rb ved at indstille:
config.active_record.schema_format = :sql
i din config/application.rb fil. Derefter db:migrate vil skrive en db/structure.sql fil (som kun er en rå SQL-dump af din PostgreSQL-database uden dine data) i stedet for db/schema.rb . Du vil også bruge forskellige Rake-opgaver til at arbejde med structure.sql :
db:structure:dumpi stedet fordb:schema:dumpdb:structure:loadi stedet fordb:schema:load
Alt andet burde fungere på samme måde.
Denne tilgang giver dig også mulighed for at bruge andre ting i din database, som ActiveRecord ikke forstår:KONTROLLER begrænsninger, udløsere, ikke-simple-mindede kolonnestandarder, ...