如何在Rails中发现模型属性?


142

我发现很难轻松查看所有模型类中都存在哪些属性/属性,因为它们未在我的类文件中明确定义。

为了发现模型属性,我将schema.rb文件保持打开状态,并在它与需要编写的任何代码之间进行切换。这行得通,但是很笨拙,因为我必须在读取模式文件以拾取属性,模型类文件以检查方法以及我编写的用于调用属性和方法的任何新代码之间切换。

我的问题是,当您第一次分析Rails代码库时,如何发现模型属性?您是否始终保持schema.rb文件处于打开状态,还是有一种更好的方法不涉及在模式文件和模型文件之间不断地切换?


7
感谢您下面的回答。听起来好像没有一种在模型源文件中声明属性名称的好方法,而是保持终端打开并戳一下对象以找出其属性。
gbc

Answers:


276

对于架构相关的东西

Model.column_names         
Model.columns_hash         
Model.columns 

例如AR对象中的变量/属性

object.attribute_names                    
object.attribute_present?          
object.attributes

例如没有从超类继承的方法

Model.instance_methods(false)

10
要也获得关联,您可以执行以下操作:Model.reflect_on_all_associations.map(&:name)
vasilakisfil 2014年

1
在ActiveRecord 5(可能更早)中,您可以调用Model.attribute_names
aceofbassgreg


15

如果您只是对数据库中的属性和数据类型感兴趣,可以使用Model.inspect

irb(main):001:0> User.inspect
=> "User(id: integer, email: string, encrypted_password: string,
 reset_password_token: string, reset_password_sent_at: datetime,
 remember_created_at: datetime, sign_in_count: integer,
 current_sign_in_at: datetime, last_sign_in_at: datetime,
 current_sign_in_ip: string, last_sign_in_ip: string, created_at: datetime,
 updated_at: datetime)"

或者,已经运行rake db:createrake db:migrate针对您的开发环境,该文件db/schema.rb将包含您的数据库结构的权威来源:

ActiveRecord::Schema.define(version: 20130712162401) do
  create_table "users", force: true do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end

10

为了描述模型,我使用以下代码段

Model.columns.collect { |c| "#{c.name} (#{c.type})" }

再次说明,这是如果您看上去很漂亮,可以描述您,ActiveRecord而无需在不介意进行属性注释之前就进行低级迁移或跳到该开发人员。


这对于为特定模型打印所有实例的所有属性是完美的-谢谢!
ConorB

4
some_instance.attributes

资料来源:网志


some_class.attributes.keys更加干净
klochner

想知道是否有任何IDE将其用于自动完成?对于Rails模型来说,这似乎是一件显而易见的事情。当我开始输入属性名称并且它不会自动完成时,我总是很失望。
frankodwyer

2
@frankodwyer-RubyMine会这样做,尽管我确定肯定还有其他人。–
Matt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.