Esta parte da sua pergunta:
Eu sei que podemos criá-lo manualmente no PostgreSQL, mas a "mágica" com o Active Record é que o banco de dados pode ser recriado com todos os modelos.
me diz que você está realmente procurando uma maneira de integrar as funções do PostgreSQL com o processo normal de migração do Rails e tarefas Rake como
db:schema:load . Adicionar e remover funções em migrações é fácil:
def up
connection.execute(%q(
create or replace function ...
))
end
def down
connection.execute(%q(
drop function ...
))
end
Você precisa usar
up separado e down métodos em vez de uma única change porque o ActiveRecord não terá ideia de como aplicar e muito menos reverter a criação de uma função. E você usa connection.execute para alimentar a definição de função bruta para o PostgreSQL. Você também pode fazer isso com um reversible dentro de 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
mas acho isso mais barulhento que
up e down . No entanto,
schema.rb e as tarefas usuais do Rake que funcionam com schema.rb (como db:schema:load e db:schema:dump ) não saberá o que fazer com as funções do PostgreSQL e outras coisas que o ActiveRecord não entende. Existe uma maneira de contornar isso, você pode optar por usar um structure.sql arquivo em vez de schema.rb definindo:config.active_record.schema_format = :sql
em seu
config/application.rb Arquivo. Depois disso, db:migrate escreverá um db/structure.sql (que é apenas um dump SQL bruto do seu banco de dados PostgreSQL sem seus dados) em vez de db/schema.rb . Você também usará diferentes tarefas Rake para trabalhar com structure.sql :db:structure:dumpem vez dedb:schema:dumpdb:structure:loadem vez dedb:schema:load
Todo o resto deve funcionar da mesma forma.
Essa abordagem também permite que você use outras coisas em seu banco de dados que o ActiveRecord não entenderá:CHECK restrições, gatilhos, padrões de coluna não simplórios, ...