Вопрос

Я хотел бы знать, можно ли получить типы (как известно как AR - например, в сценарии миграции и базе данных) программно (я знаю, что данные существуют там где-то).

Например, я могу иметь дело со всеми именами атрибутов:

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

.attributes только что возвращает отображение имен в их текущие значения (например, не информация о типе, если поле не установлено).

В некоторых местах я видел его с информацией типа:

В скрипте / консоли введите имя объекта AR:

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

Так что ясно это знает типы. Кроме того, есть .Column_For_Attribute, который принимает имя привлечения и возвращает объект столбца - который имеет тип похоронен в основном объекте столбца базы данных, но, похоже, не является чистым способом получения его.

Я бы также был заинтересован в том случае, если есть способ, которым дружелюбный для нового «ActiveModel», который приближается (Rails3) и разделяется из конкретных данных базы данных (но, возможно, тип информации не будет частью этого, я не могу Узнайте, если это есть).

Спасибо.

Это было полезно?

Решение

В рельсах 3, для вашей модели «водитель», вы хотите Driver.columns_hash.

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

Если вы хотите пройти через них, вы сделаете что-то подобное:

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

который будет выводить следующее:

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

Другие советы

Вы можете получить доступ к типам столбцов, делая это:

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

Если вы хотите получить список всех типов столбцов в определенной модели, вы можете сделать:

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

В рельсах 5 вы можете сделать это независимо от базы данных. Это важно, если вы используете новые атрибуты API для определения (дополнительных) атрибутов.

Получение всех атрибутов из класса модели:

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

Получение типа:

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

Это иногда больше информации, чем необходимо. Там есть удобная функция, которая отображает все эти типы до набора основных (: integer,: String и т. Д.)

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

Вы также можете получить все эти данные в одном звонке с Attribute_Types, который возвращает 'name': type хэш

В Rails 5 Это даст вам список всех имен полей вместе со своим типом данных:

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

Этот фрагмент предоставит вам все атрибуты модели с соответствующими типами данных базы данных в хэш. Просто замените сообщение с вашей активной моделью записи.

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

Вернет хеш, как это.

=> {:id=>:integer, :title=>:string, :body=>:text, :created_at=>:datetime, :updated_at=>:datetime, :topic_id=>:integer, :user_id=>:integer} 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top