PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Posso escrever funções PostgreSQL em Ruby on Rails?


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