代码之家  ›  专栏  ›  技术社区  ›  Michael Neale

获取ActiveRecord对象中的属性类型

  •  61
  • Michael Neale  · 技术社区  · 14 年前

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

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

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

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

    我看到的一些地方有类型信息:

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

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

    很明显它知道类型。此外,还有.column_for_属性,它采用attr名称并返回一个column对象,该对象的类型隐藏在基础数据库列对象中,但它似乎不是一个获得它的干净方法。

    如果有一种方法对即将到来的新“activeModel”(rails3)是友好的,并且与数据库的细节脱钩(但类型信息可能不会是其中的一部分,我似乎不知道它是否是),我也会感兴趣。

    谢谢。

    5 回复  |  直到 8 年前
        1
  •  91
  •   Grant Birchmeier    11 年前

    在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
    
        2
  •  21
  •   Grant Birchmeier    9 年前

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

    #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
  •  16
  •   Matthias Winkelmann    9 年前

    在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 
    

    您还可以在一次调用中获取所有数据,该调用具有返回 'name': type 搞砸。

        4
  •  4
  •   Amin    8 年前

    在Rails 5中,这将为您提供所有字段名及其数据类型的列表:

    Model_Name.attribute_names.each do |k| puts "#{k} = #{Model_Name.type_for_attribute(k).type}" end
    
        5
  •  1
  •   xander-miller    9 年前

    此代码段将为您提供具有哈希中关联数据库数据类型的模型的所有属性。只需将日志替换为活动记录模型。

    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}