获取ActiveRecord对象中属性的types

我想知道是否有可能通过编程(我知道数据存在于某处)获取types(如AR所知 – 例如在迁移脚本和数据库中)。

例如,我可以处理所有的属性名称:

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

.attributes只是返回名称到它们当前值的映射(例如,如果字段没有设置,则没有types信息)。

一些地方我看到它的types信息:

在脚本/控制台中,键入一个AR实体的名称:

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

很明显,它知道types。 此外,还有.column_for_attribute,它采用一个attr名称并返回一个列对象 – 它具有埋在底层数据库列对象中的types,但它似乎不是一个干净的方法来获取它。

我也会感兴趣,如果有一种方法是友好的新的“ActiveModel”即将到来(rails3)和数据库的具体解耦(但也许types信息不会是其中的一部分,我似乎无法找出是否是)。

谢谢。

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

您可以通过执行以下操作来访问列的types:

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

如果您想获得特定模型中所有列types的列表,可以这样做:

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

在Rails 5中,你可以独立于数据库来做到这一点。 如果使用新的Attributes API来定义(附加)属性,这一点很重要。

从模型类获取所有属性:

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

获取types:

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

这有时候比需要更多的信息。 有一个便利的function,将所有这些types映射到核心集(:integer,:string等)

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

您也可以在一次调用中获得所有数据,并返回'name': type hash。

在rails 5中,这将给你一个所有字段名称及其数据types的列表:

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

这段代码会给你一个模型的所有属性,并在散列中显示关联的数据库数据types。 只需用您的活动logging模型replacePost。

 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}