Тази част от въпроса ви:
Знам, че можем да го създадем ръчно в PostgreSQL, но „магията“ с Active Record е, че базата данни може да бъде пресъздадена с всички модели.
ми казва, че наистина търсите начин да интегрирате PostgreSQL функции с нормалния процес на миграция на Rails и Rake задачи като db:schema:load
.
Добавянето и премахването на функции в миграцията е лесно:
def up
connection.execute(%q(
create or replace function ...
))
end
def down
connection.execute(%q(
drop function ...
))
end
Трябва да използвате отделен up
и down
методи вместо единична change
метод, защото ActiveRecord няма да има представа как да приложи, да не говорим за обръщане на създаване на функция. И вие използвате connection.execute
за да подадете необработената дефиниция на функцията към PostgreSQL. Можете също да направите това с reversible
вътре в 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
но намирам, че това е по-шумно от up
и down
.
Въпреки това, schema.rb
и обичайните Rake задачи, които работят с schema.rb
(като db:schema:load
и db:schema:dump
) няма да знае какво да прави с функциите на PostgreSQL и други неща, които ActiveRecord не разбира. Все пак има начин да заобиколите това, можете да изберете да използвате structure.sql
файл вместо schema.rb
чрез настройка:
config.active_record.schema_format = :sql
във вашия config/application.rb
файл. След това db:migrate
ще напише db/structure.sql
файл (който е просто необработен SQL дъмп на вашата PostgreSQL база данни без вашите данни) вместо db/schema.rb
. Също така ще използвате различни задачи на Rake за работа с structure.sql
:
db:structure:dump
вместоdb:schema:dump
db:structure:load
вместоdb:schema:load
Всичко останало трябва да работи по същия начин.
Този подход също така ви позволява да използвате други неща във вашата база данни, които ActiveRecord няма да разбере:ПРОВЕРЯТЕ ограничения, тригери, непростомислещи колони по подразбиране, ...