Тази част от въпроса ви:
Знам, че можем да го създадем ръчно в 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:dumpdb:structure:loadвместоdb:schema:load
Всичко останало трябва да работи по същия начин.
Този подход също така ви позволява да използвате други неща във вашата база данни, които ActiveRecord няма да разбере:ПРОВЕРЯТЕ ограничения, тригери, непростомислещи колони по подразбиране, ...