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
Sorry, comments are closed for this article.





Comentários