Получение типов атрибутов в объекте ActiveRecord

Я хотел бы знать, возможно ли получить типы (как известный 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, который берет имя attr и возвращает объект столбца - которому проложили тип под землей в базовом объекте столбца базы данных, но это, кажется, не очевидный способ для получения его.

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

Спасибо.

62
задан 8 March 2010 в 09:03

4 ответа

В направляющих 3, для Вашей модели "Driver", Вы хотите 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
97
ответ дан 31 October 2019 в 13:37

В направляющих 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>

Это иногда - больше информации, чем необходимый. Существует функция удобства, которая отображает все эти типы вниз на базовый набор (: целое число: представьте в виде строки и т.д.)

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

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

16
ответ дан 31 October 2019 в 13:37

В направляющих 5 это даст Вам список всех имен полей наряду с их типом данных:

Model_Name.attribute_names.each do |k| puts "#{k} = #{Model_Name.type_for_attribute(k).type}" end
5
ответ дан 31 October 2019 в 13:37

Этот отрывок даст Вам все атрибуты модели со связанными типами данных базы данных в хеше. Просто замените Сообщение своей Активной Рекордной Моделью.

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} 
1
ответ дан 31 October 2019 в 13:37

Другие вопросы по тегам:

Похожие вопросы: