February 3, 2009

Plugin para usar esquemas do PostgreSQL com JRuby

Filed under: postgresql, rails — coutinho @ 2:11 am

Se alguém aqui já teve que fazer uma aplicação razoavelmente grande com rails e PostgreSQL, ou se mesmo sem a aplicação ser muito grande teve necessidade usar os “esquemas” do postgresql, viu que o rails, mesmo com o ruby, tem alguma dificuldade para trabalhar com eles.

Usando rails 1.x você podia usar algo como:

set_table_name “financeiro.pagamentos”

Já usando o rails 2.x isso gera um erro nas consultas no postgresql pois em um find normal a consulta é montada assim:

select * from “financeiro.pagamentos”

ao invés de

select * from “financeiro”.“pagamentos”

No rails 2 você consegue usar tabelas em vários esquemas desde que eles estejam no search_path, o que nem sempre é viável em algumas aplicações, sem contar que isso não funciona para a operações onde se precisa ler os metadados da tabela, uma vez que é necessário pesquisar os metadados no PostgreSQL usando o nome da tabela e o nome do esquema.

O bom é que a gente quase não usa consultas de metadados.
O ruim é que no Jruby elas são executadas a todo momento, pois o driver JDBC precisa saber os tipos de cada coluna para montar o result set e retornar para a aplicação cliente. Assim uma aplicação rails que acessa tabelas em diferentes esquemas ao ser migrada para de ruby para jruby simplesmente para de funcionar.

A solução que encontrei para isso foi criar um plugin através do qual eu tenho um metodo set_schema_name, semelhante ao set_table_name, assim eu posso especificar o nome do esquema onde está a tabela. Esse plugin pode ser usado também nso migrates para definir o esquema onde você está executando seus migrates.

Veja abaixo como é facil:

class CreatePagamento < ActiveRecord::Migration
set_schema_name :financeiro
def self.up

end

class Pagamento < activeRecord::Base
acts_as_schema_support
set_schema_name :financeiro
end

Por enquanto o plugin é só para JRuby, mas em breve vou fazer ele funcionar no Ruby também.

Aproveitei para ver como funciona o github e publiquei o plugin lá:
http://github.com/mondrian/acts_as_schema_support

Dúvidas, críticas e sugetões, enviem e-mail pra mim: coutinho em mondriantecnologia.com