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:dump
místodb:schema:dump
db:structure:load
mí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é, ...