Gem has_many_select

O problema

Estava fazendo a migração de um sistema para a versão 2.1 do rails, que usa tabelas sem qualquer normalização ou padrão de DB, e me deparei com o seguinte problema:

1
2
3
4
5
6
7
  class HeaderSale < ActiveRecord::Base
    set_table_name("cab_pedido")
    set_primary_key("r_e_c_n_o_")

    has_many :justifications,
      :foreign_key => 'nr_pedido'
  end

O problema é que tenho uma campo chamado ‘r_e_c_n_o_’ que é serial(auto incremento), mais não é uma primary key. Pra complicar eu tenho um outro campo, chamado ‘cpv_pedido’ que a primary key e também é auto incremento (pega o último e soma), ou seja, este banco é um “sonho” para qualquer desenvolvedor.

Quando eu faço um busca:

1
2
3
4
x = HeaderSale.find(:first, :conditions => 'cpv_pedido = 193514')
   => 'SELECT * FROM "cab_pedido_vendas" WHERE (cpv_pedido = 193514) LIMIT 1'
x.justifications
   => 'SELECT * FROM "justificativa" WHERE ("justificativa".nr_pedido = 307634)'

Mais o correto seria:


=> 'SELECT * FROM "justificativa" WHERE ("justificativa".nr_pedido = 193514)'

Para resolver este problema, criei a gem has_many_select – não sei porque dei este nome, que temporariamente resolve o problema, já que na próxima versão do rails teremos está opção.

Como usar ?

Primeiro passo é instalar a gem:

1
2
gem sources -a http://gems.github.com
gem install ozeias-has_many_select

Depois no environment.rb


require 'has_many_select'

No relacionamento do model:

1
2
3
4
5
6
7
  class HeaderSale < ActiveRecord::Base
    set_table_name("cab_pedido")
    set_primary_key("r_e_c_n_o_")

    has_many :justifications,
      :foreign_key => 'nr_pedido', :primary_key => 'cpv_pedido'
  end

O resultado:

1
2
3
4
x = HeaderSale.find(:first, :conditions => 'cpv_pedido = 193514')
   => 'SELECT * FROM "cab_pedido_vendas" WHERE (cpv_pedido = 193514) LIMIT 1'
x.justifications
   => 'SELECT * FROM "justificativa" WHERE ("justificativa".nr_pedido = 193514)'

E agora?

E agora, se a gem estiver sendo útil para você, não se esqueça de me recomendar no working with rails.

Sugestões, dicas e críticas são bem-vindas.

Update 22/08/2008:

Apesar de ter mudado meu login no github, o nome da gem não foi atualizado. Valeu Marcus. O correto é:

1
2
gem sources -a http://gems.github.com
gem install ozsantana-has_many_select

No github: http://github.com/ozeias/has_many_select/tree/master

6 Comments on “Gem has_many_select

  1. Uma mão na roda pra quem trabalha com bancos “super normalizados”. Parabéns Ozéias, sempre resolvendo problemos e divulgando a solução. Muito bom!

  2. Mano, só uma sugestão. Neste caso como é algo totalmente dependente do Rails, não seria melhor um plugin ao invés de gem?

    Assim não seria necessário o require no environment.rb.

  3. Preferi a gem, pela facilidade de usarmos em mais de um projeto.

  4. Carlos, lembro de um railscast onde você e o Akita recomendavam a criação de gem ao invés de plugin. Afinal, o que acha mais viável?

  5. @marcus eu mudei o post aqui pensando que ia ser atualizado as gems quando atualizei o meu username no github. Mais valeu pela dica. Abraço.