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
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!
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.
Preferi a gem, pela facilidade de usarmos em mais de um projeto.
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?
Bacana essa gem, estou usando em um projeto para auxiliar na importacao de dados.
Há um pequeno erro neste post. O nome correto da gem para instalação é:
gem install ozsantana-has_many_select
http://github.com/ozeias/has_many_select/tree/master
@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.