Подтвердить что ты не робот

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

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

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

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

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

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

в консоли script/console введите имя объекта AR:

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

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

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

Спасибо.

4b9b3361

Ответ 1

В Rails 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

Ответ 2

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

#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

Ответ 3

В Rails 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 

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

Ответ 4

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

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

Ответ 5

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

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} 

Ответ 6

Rails 5+ (работает также с виртуальными атрибутами):

Model.attribute_types['some_attribute'].type