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

gbc*_*gbc 135 activerecord ruby-on-rails

我发现很难很容易地看到我的所有模型类中存在哪些属性/属性,因为它们没有在我的类文件中明确定义.

为了发现模型属性,我保持schema.rb文件打开并在它和我正在编写的代码之间进行翻转.这很有效,但是很笨重,因为我必须在读取模式文件以获取属性,模型类文件以检查方法以及我正在编写的任何新代码来调用属性和方法之间切换.

我的问题是,当您第一次分析Rails代码库时,如何发现模型属性?你是否一直打开schema.rb文件,还是有更好的方法不涉及在模式文件和模型文件之间不断跳转?

pen*_*ger 266

对于Schema相关的东西

Model.column_names         
Model.columns_hash         
Model.columns 
Run Code Online (Sandbox Code Playgroud)

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

object.attribute_names                    
object.attribute_present?          
object.attributes
Run Code Online (Sandbox Code Playgroud)

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

Model.instance_methods(false)
Run Code Online (Sandbox Code Playgroud)

  • 要获得关联,您还可以:Model.reflect_on_all_associations.map(&:name) (10认同)
  • 在 ActiveRecord 5(可能更早)中,您可以调用`Model.attribute_names`。 (2认同)

ez.*_*ez. 26

有一个名为Annotate models的rails插件,它将在模型文件的顶部生成模型属性,这里是链接:

https://github.com/ctran/annotate_models

为了使注释保持同步,您可以编写任务以在每次部署后重新生成注释模型.

  • 我假设的新网站是相同的插件,https://github.com/ctran/annotate_models (3认同)

Nic*_*ick 13

如果您只对数据库中的属性和数据类型感兴趣,则可以使用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)"
Run Code Online (Sandbox Code Playgroud)

或者,运行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
Run Code Online (Sandbox Code Playgroud)


Har*_*ina 9

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

Model.columns.collect { |c| "#{c.name} (#{c.type})" }
Run Code Online (Sandbox Code Playgroud)

再一次,如果你看起来很漂亮,可以描述你,ActiveRecord而不必通过迁移或跳过开发人员,然后你就可以在属性中发表评论了.


mca*_*dre 5

some_instance.attributes
Run Code Online (Sandbox Code Playgroud)

来源:博客

  • some_class.attributes.keys 更干净一些 (2认同)
  • @frankodwyer - RubyMine 确实如此,但我确信肯定还有其他人。 (2认同)