Dit deel van je vraag:
Ik weet dat we het handmatig kunnen maken in PostgreSQL, maar de "magie" van Active Record is dat de database opnieuw kan worden gemaakt met alle modellen.
vertelt me dat je echt op zoek bent naar een manier om PostgreSQL-functies te integreren met het normale Rails-migratieproces en Rake-taken zoals db:schema:load
.
Het toevoegen en verwijderen van functies in migraties is eenvoudig:
def up
connection.execute(%q(
create or replace function ...
))
end
def down
connection.execute(%q(
drop function ...
))
end
Je moet aparte up
. gebruiken en down
methoden in plaats van een enkele change
methode omdat ActiveRecord geen idee heeft hoe het moet worden toegepast, laat staan dat het maken van een functie ongedaan wordt gemaakt. En je gebruikt connection.execute
om de onbewerkte functiedefinitie naar PostgreSQL te voeren. Je kunt dit ook doen met een reversible
binnen 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
maar dat vind ik luidruchtiger dan up
en down
.
Echter, schema.rb
en de gebruikelijke Rake-taken die werken met schema.rb
(zoals db:schema:load
en db:schema:dump
) niet weten wat te doen met PostgreSQL-functies en andere dingen die ActiveRecord niet begrijpt. Er is echter een manier om dit te omzeilen, je kunt ervoor kiezen om een structure.sql
. te gebruiken bestand in plaats van schema.rb
door in te stellen:
config.active_record.schema_format = :sql
in uw config/application.rb
het dossier. Daarna db:migrate
zal een db/structure.sql
. schrijven bestand (dat slechts een onbewerkte SQL-dump is van uw PostgreSQL-database zonder uw gegevens) in plaats van db/schema.rb
. Je zult ook verschillende Rake-taken gebruiken voor het werken met structure.sql
:
db:structure:dump
in plaats vandb:schema:dump
db:structure:load
in plaats vandb:schema:load
Al het andere zou hetzelfde moeten werken.
Met deze aanpak kunt u ook andere dingen in uw database gebruiken die ActiveRecord niet begrijpt:CONTROLEER beperkingen, triggers, niet-eenvoudige kolomstandaarden, ...