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