Получение типов атрибутов в объекте Activerecord
-
25-09-2019 - |
Вопрос
Я хотел бы знать, можно ли получить типы (как известно как 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}