Tato část vaší otázky:
Vím, že to můžeme vytvořit ručně v PostgreSQL, ale "kouzlo" s Active Record spočívá v tom, že databázi lze znovu vytvořit se všemi modely.
říká mi, že opravdu hledáte způsob, jak integrovat funkce PostgreSQL s normálním procesem migrace Rails a úlohami Rake, jako je db:schema:load .
Přidávání a odebírání funkcí při migracích je snadné:
def up
connection.execute(%q(
create or replace function ...
))
end
def down
connection.execute(%q(
drop function ...
))
end
Musíte použít samostatný up a down metody namísto jediné change protože ActiveRecord nebude mít ponětí, jak použít, natož zvrátit vytvoření funkce. A použijete connection.execute k načtení nezpracované definice funkce do PostgreSQL. Můžete to také provést pomocí reversible uvnitř 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
ale přijde mi to hlučnější než up a down .
Nicméně schema.rb a obvyklé úlohy Rake, které pracují s schema.rb (například db:schema:load a db:schema:dump ) nebude vědět, co dělat s funkcemi PostgreSQL a dalšími věcmi, kterým ActiveRecord nerozumí. Existuje způsob, jak to obejít, můžete se rozhodnout použít structure.sql namísto schema.rb nastavením:
config.active_record.schema_format = :sql
ve vašem config/application.rb soubor. Poté db:migrate zapíše db/structure.sql soubor (což je jen nezpracovaný SQL výpis vaší PostgreSQL databáze bez vašich dat) namísto db/schema.rb . Pro práci s structure.sql budete také používat různé úlohy Rake :
db:structure:dumpmístodb:schema:dumpdb:structure:loadmístodb:schema:load
Vše ostatní by mělo fungovat stejně.
Tento přístup vám také umožňuje používat ve vaší databázi další věci, kterým ActiveRecord nebude rozumět:ZKONTROLUJTE omezení, spouštěče, výchozí hodnoty sloupců, které nejsou jednoduché, ...