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:dump
i stedet fordb:schema:dump
db:structure:load
i 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, ...