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:dump
zamiastdb:schema:dump
db:structure:load
zamiastdb: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, ...