首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取ActiveRecord对象中的属性类型

获取ActiveRecord对象中的属性类型
EN

Stack Overflow用户
提问于 2010-03-08 13:57:26
回答 8查看 48.9K关注 0票数 72

我想知道是否有可能以编程方式获取类型(如AR -例如在迁移脚本和数据库中)(我知道数据存在于其中的某个地方)。

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

代码语言:javascript
复制
ar.attribute_names.each { |name| puts name }

.attributes只返回名称到其当前值的映射(例如,如果字段未设置,则不返回类型信息)。

我在一些地方看到过它的类型信息:

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

代码语言:javascript
复制
>> Driver
=> Driver(id: integer, name: string, created_at: datetime, updated_at: datetime)

所以很明显,它知道类型。此外,还有.column_for_attribute,它接受一个attr名称并返回一个column对象-它的类型隐藏在底层数据库的column对象中,但它似乎不是一种获取它的干净方法。

我也想知道是否有一种方法对即将到来的新的"ActiveModel“(rails3)是友好的,并且与数据库细节解耦(但类型信息可能不是它的一部分,我似乎找不到它)。

谢谢。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-03-28 02:49:59

在Rails3中,对于您的模型"Driver",您需要Driver.columns_hash

代码语言:javascript
复制
Driver.columns_hash["name"].type  #returns :string

如果你想遍历它们,你可以这样做:

代码语言:javascript
复制
Driver.columns_hash.each {|k,v| puts "#{k} => #{v.type}"}

它将输出以下内容:

代码语言:javascript
复制
id => integer
name => string
created_at => datetime
updated_at => datetime
票数 110
EN

Stack Overflow用户

发布于 2016-02-24 10:59:48

在Rails 5中,您可以独立于Database完成此操作。如果您使用新的attributes API来定义(其他)属性,这一点很重要。

从模型类中获取所有属性:

代码语言:javascript
复制
pry> User.attribute_names
=> ["id",
 "firstname",
 "lastname",
 "created_at",
 "updated_at",
 "email",...

获取类型:

代码语言:javascript
复制
pry> User.type_for_attribute('email')
=> #<ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::MysqlString:0x007ffbab107698
 @limit=255,
 @precision=nil,
 @scale=nil>

这有时比所需的信息更多。有一个方便的函数可以将所有这些类型映射到一个核心集(:整数、:字符串等)。

代码语言:javascript
复制
> User.type_for_attribute('email').type
=> :string 

您还可以使用返回'name': type散列的attribute_types在一次调用中获取所有这些数据。

票数 34
EN

Stack Overflow用户

发布于 2010-03-08 14:14:52

您可以通过执行以下操作访问列的类型:

代码语言:javascript
复制
#script/console
Driver.columns.each {|c| puts c.type}

如果要获取特定模型中所有列类型的列表,可以执行以下操作:

代码语言:javascript
复制
Driver.columns.map(&:type) #gets them all
Driver.columns.map(&:type).uniq #gets the unique ones
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2399556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档