Denna del av din fråga:
Jag vet att vi kan skapa det manuellt i PostgreSQL, men "magin" med Active Record är att databasen kan återskapas med alla modeller.
säger mig att du verkligen letar efter ett sätt att integrera PostgreSQL-funktioner med den normala Rails-migreringsprocessen och Rake-uppgifter som db:schema:load
.
Det är enkelt att lägga till och ta bort funktioner i migrering:
def up
connection.execute(%q(
create or replace function ...
))
end
def down
connection.execute(%q(
drop function ...
))
end
Du måste använda separat up
och down
metoder istället för en enda change
metod eftersom ActiveRecord inte har någon aning om hur man tillämpar än mindre omvända en funktionsskapande. Och du använder connection.execute
för att mata den råa funktionsdefinitionen till PostgreSQL. Du kan också göra detta med en reversible
inuti 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 jag tycker att det är bullrigare än up
och down
.
Men schema.rb
och de vanliga Rake-uppgifterna som fungerar med schema.rb
(som db:schema:load
och db:schema:dump
) kommer inte att veta vad de ska göra med PostgreSQL-funktioner och andra saker som ActiveRecord inte förstår. Det finns dock en väg runt detta, du kan välja att använda en structure.sql
fil istället för schema.rb
genom att ställa in:
config.active_record.schema_format = :sql
i din config/application.rb
fil. Efter det, db:migrate
kommer att skriva en db/structure.sql
fil (som bara är en rå SQL-dump av din PostgreSQL-databas utan dina data) istället för db/schema.rb
. Du kommer också att använda olika Rake-uppgifter för att arbeta med structure.sql
:
db:structure:dump
istället fördb:schema:dump
db:structure:load
istället fördb:schema:load
Allt annat borde fungera likadant.
Det här tillvägagångssättet låter dig också använda andra saker i din databas som ActiveRecord inte förstår:KONTROLLERA begränsningar, utlösare, oenkla kolumnstandardvärden, ...