JavaFree.org | RubyOnBr.org

obtendo meta dados de uma tabela

Acompanhar obtendo meta dados de uma tabela 3 posts, 2 participantes

Avatar Urubatan 145 posts

Consegui pensar até agora em duas formas de fazer isto:
primeira, vamos dizer que exista uma tabela com a seguinte estrutura:

(faz de conta que isto é SQL fiquei com preguiça de conectar no banco pra pegar o schema)

eu quero ler o schema desta tabela para usar em um generator, consegui pensar em duas maneiras:
1) usando a connection direto
ActiveRecord::Base.connection.table_structure ‘examples’
ActiveRecord::Base.connection.indexes ‘examples’

o problema desta abordagem é que para o table structure ele me retorna um array de hashes onde os valores do hash são strings também, por exemplo “notnull”=>"0" ou “notnull”=>"99" e ficaria um saco de comparar isto, claro sempre posso converter para inteiro para comparar …

2) criando dinamicamente a classe que seria o Model para aquela tabela e listando as colunas de la

A idéia deste generator que estou fazendo é para aumentar o DRY dos meus projetos, por exemplo, no migration eu ja defini quais colunas podem ou não ser nulas, qual o tamanho máximo dos campos string, …
estou fazendo um generator que faz um dump disto e cria o model, pelo menos na criação, atualizar vai ficar mais dificil :D

Vocês acham que é uma idéia no minimo decente? ou é perda de tempo?
considerando que seja uma idéia decente, qual das abordagens que encontrei para buscar o schema de uma tabela é a menos podre? existe outra forma?

Valeus!

 
Avatar Shairon Toledo 1291 posts

Tem o columns_hash do AR, resolveria seu problema? Veja um model Tracking

DDL


CREATE TABLE trackings
(
id serial NOT NULL,
device_id integer,
latitude double precision,
longitude double precision,
altitude double precision,
azimuth integer,
distance double precision,
speed integer,
device_time timestamp without time zone,
package_number integer,
created_on timestamp without time zone,
updated_on timestamp without time zone,
CONSTRAINT trackings_pkey PRIMARY KEY (id)
)

AR

output

“created_on”
#<ActiveRecord::ConnectionAdapters::Column:0xb7003824
@default=nil,
@limit=nil,
@name=“created_on”,
@null=true,
@precision=nil,
@primary=false,
@scale=nil,
@sql_type=“datetime”,
@type=:datetime>
“device_time”
#<ActiveRecord::ConnectionAdapters::Column:0xb700393c
@default=nil,
@limit=nil,
@name=“device_time”,
@null=true,
@precision=nil,
@primary=false,
@scale=nil,
@sql_type=“datetime”,
@type=:datetime>
“latitude”
#<ActiveRecord::ConnectionAdapters::Column:0xb7003bf8
@default=nil,
@limit=nil,
@name=“latitude”,
@null=true,
@precision=nil,
@primary=false,
@scale=nil,
@sql_type=“double precision”,
@type=:float>
“altitude”
#<ActiveRecord::ConnectionAdapters::Column:0xb7003734
@default=nil,
@limit=nil,
@name=“altitude”,
@null=true,
@precision=nil,
@primary=false,
@scale=nil,
@sql_type=“double precision”,
@type=:float>
“package_number”
#<ActiveRecord::ConnectionAdapters::Column:0xb70038ec
@default=nil,
@limit=nil,
@name=“package_number”,
@null=true,
@precision=nil,
@primary=false,
@scale=nil,
@sql_type=“integer”,
@type=:integer>
“updated_on”
#<ActiveRecord::ConnectionAdapters::Column:0xb7003784
@default=nil,
@limit=nil,
@name=“updated_on”,
@null=true,
@precision=nil,
@primary=false,
@scale=nil,
@sql_type=“datetime”,
@type=:datetime>
“device_id”
#<ActiveRecord::ConnectionAdapters::Column:0xb7003c70
@default=nil,
@limit=nil,
@name=“device_id”,
@null=true,
@precision=nil,
@primary=false,
@scale=nil,
@sql_type=“integer”,
@type=:integer>
“azimuth”
#<ActiveRecord::ConnectionAdapters::Column:0xb7003b08
@default=nil,
@limit=nil,
@name=“azimuth”,
@null=true,
@precision=nil,
@primary=false,
@scale=nil,
@sql_type=“integer”,
@type=:integer>
“id”
#<ActiveRecord::ConnectionAdapters::Column:0xb7003cc0
@default=nil,
@limit=nil,
@name=“id”,
@null=false,
@precision=nil,
@primary=true,
@scale=nil,
@sql_type=“integer”,
@type=:integer>
“speed”
#<ActiveRecord::ConnectionAdapters::Column:0xb7003a18
@default=nil,
@limit=nil,
@name=“speed”,
@null=true,
@precision=nil,
@primary=false,
@scale=nil,
@sql_type=“integer”,
@type=:integer>
“longitude”
#<ActiveRecord::ConnectionAdapters::Column:0xb7003b80
@default=nil,
@limit=nil,
@name=“longitude”,
@null=true,
@precision=nil,
@primary=false,
@scale=nil,
@sql_type=“double precision”,
@type=:float>
“distance”
#<ActiveRecord::ConnectionAdapters::Column:0xb7003a90
@default=nil,
@limit=nil,
@name=“distance”,
@null=true,
@precision=nil,
@primary=false,
@scale=nil,
@sql_type=“double precision”,
@type=:float>

 
Avatar Urubatan 145 posts

Resolve sim, mas como quero criar a classe do model neste generator (para evitar de precisar digitar novamente as validações que ja existem no banco de dados), acho que vou utilizar o ActiveRecord::Base.connection.columns
que me da estes mesmos dados, mas sem eu precisar criar um AR antes :D

ainda não tenho certeza se esta é uma boa prática, mas neste caso, a preguiça fala mais alto :D
se o plugin ficar decente eu disponibilizo depois para quem quiser brincar com ele :D