Pregunta

Me gustaría saber si es posible obtener los tipos (como se conoce por AR - por ejemplo, en el script de migración y base de datos) mediante programación (sé que existen los datos en alguna parte).

Por ejemplo, se puede tratar con todos los nombres de los atributos:

ar.attribute_names.each { |name| puts name }

.attributes sólo devuelve un mapeo de los nombres de sus valores actuales (por ejemplo, no hay información de tipo si el campo no está establecido).

Algunos de los lugares que he visto con la información del tipo:

en escritura / consola, escriba el nombre de una entidad AR:

>> Driver
=> Driver(id: integer, name: string, created_at: datetime, updated_at: datetime)

Así que está claro que conoce los tipos. Además, hay .column_for_attribute, que toma un atributo 'name' y devuelve un objeto de columna - que tiene el tipo enterrado en el objeto de columna de base de datos subyacente, pero no parece ser una forma limpia para conseguirlo.

Me sería también esté interesado en si hay una manera que es amigable para el nuevo "ActiveModel" que se avecina (rails3) y se desacopla de aspectos específicos de bases de datos (pero tal vez escriba información no será parte de la misma, que puede' t parecen averiguar si lo es).

Gracias.

¿Fue útil?

Solución

En Rails 3, para su modelo de "controlador", que desea Driver.columns_hash.

Driver.columns_hash["name"].type  #returns :string

Si desea iterar a través de ellos, que haría algo como esto:

Driver.columns_hash.each {|k,v| puts "#{k} => #{v.type}"}

que es la salida siguiente:

id => integer
name => string
created_at => datetime
updated_at => datetime

Otros consejos

Se puede acceder a los tipos de las columnas al hacer esto:

#script/console
Driver.columns.each {|c| puts c.type}

Si desea obtener una lista de todos los tipos de columna en un modelo en particular, se puede hacer:

Driver.columns.map(&:type) #gets them all
Driver.columns.map(&:type).uniq #gets the unique ones

En los carriles 5, se puede hacer esto de forma independiente de la base de datos. Esto es importante si utiliza la nueva API de atributos para definir (adicional) atributos.

Obtener todos los atributos de una clase de modelo:

pry> User.attribute_names
=> ["id",
 "firstname",
 "lastname",
 "created_at",
 "updated_at",
 "email",...

Conseguir el tipo:

pry> User.type_for_attribute('email')
=> #<ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::MysqlString:0x007ffbab107698
 @limit=255,
 @precision=nil,
 @scale=nil>

Esto es a veces más información de la necesaria. Hay una función de conveniencia que mapea todos estos tipos a un conjunto básico (: número entero,:. Cuerdas, etc)

> User.type_for_attribute('email').type
=> :string 

También puede conseguir todos esos datos en una llamada con attribute_types que devuelve un hash 'name': type.

En los carriles 5 esto le dará una lista de todos los nombres de campo, junto con su tipo de datos:

Model_Name.attribute_names.each do |k| puts "#{k} = #{Model_Name.type_for_attribute(k).type}" end

Este fragmento de código le dará todos los atributos de un modelo con los tipos de datos de base de datos asociados en un hash. Basta con sustituir un comentario con su modelo Active Record.

Post.attribute_names.map {|n| [n.to_sym,Post.type_for_attribute(n).type]}.to_h

devolverá un hash de esta manera.

=> {:id=>:integer, :title=>:string, :body=>:text, :created_at=>:datetime, :updated_at=>:datetime, :topic_id=>:integer, :user_id=>:integer} 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top