Ta część twojego pytania:
Wiem, że możemy stworzyć ją ręcznie w PostgreSQL, ale „magia” Active Record polega na tym, że bazę danych można odtworzyć ze wszystkimi modelami.
mówi mi, że naprawdę szukasz sposobu na zintegrowanie funkcji PostgreSQL z normalnym procesem migracji Rails i zadaniami Rake, takimi jak db:schema:load .
Dodawanie i usuwanie funkcji w migracjach jest łatwe:
def up
connection.execute(%q(
create or replace function ...
))
end
def down
connection.execute(%q(
drop function ...
))
end
Musisz użyć oddzielnego up i down metody zamiast pojedynczej change metody, ponieważ ActiveRecord nie będzie miał pojęcia, jak zastosować, nie mówiąc już o odwróceniu tworzenia funkcji. I używasz connection.execute aby przesłać surową definicję funkcji do PostgreSQL. Możesz to również zrobić za pomocą reversible wewnątrz 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 uważam, że jest to głośniejsze niż up i down .
Jednak schema.rb i zwykłe zadania rake, które działają z schema.rb (np. db:schema:load i db:schema:dump ) nie będzie wiedział, co zrobić z funkcjami PostgreSQL i innymi rzeczami, których ActiveRecord nie rozumie. Istnieje jednak sposób na obejście tego, możesz użyć structure.sql plik zamiast schema.rb przez ustawienie:
config.active_record.schema_format = :sql
w swoim config/application.rb plik. Następnie db:migrate napisze db/structure.sql plik (który jest po prostu surowym zrzutem bazy danych PostgreSQL bez Twoich danych) zamiast db/schema.rb . Będziesz także używać różnych zadań Rake do pracy z structure.sql :
db:structure:dumpzamiastdb:schema:dumpdb:structure:loadzamiastdb:schema:load
Wszystko inne powinno działać tak samo.
Takie podejście pozwala również na użycie innych rzeczy w Twojej bazie danych, których ActiveRecord nie zrozumie:ograniczeń CHECK, wyzwalaczy, nieprostych wartości domyślnych kolumn, ...