【问题标题】:How do you discover model attributes in Rails?如何在 Rails 中发现模型属性?
【发布时间】:2010-11-20 08:19:09
【问题描述】:

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

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

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

【问题讨论】:

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

标签: ruby-on-rails activerecord


【解决方案1】:
some_instance.attributes

来源:blog

【讨论】:

  • some_class.attributes.keys 干净一些
  • 想知道是否有任何 IDE 使用它来自动完成?对于 Rails 模型来说,这似乎是一件显而易见的事情。当我开始输入属性名称并且它没有自动完成时,我总是很失望。
  • @frankodwyer - RubyMine 可以,但我确定肯定还有其他人。
【解决方案2】:

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

https://github.com/ctran/annotate_models

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

【讨论】:

【解决方案3】:

对于 Schema 相关的东西

Model.column_names         
Model.columns_hash         
Model.columns 

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

object.attribute_names                    
object.attribute_present?          
object.attributes

对于没有从超类继承的实例方法

Model.instance_methods(false)

【讨论】:

  • 要获得关联,您也可以这样做:Model.reflect_on_all_associations.map(&:name)
  • 在 ActiveRecord 5(可能更早)中,您可以调用 Model.attribute_names
【解决方案4】:

如果您只对数据库中的属性和数据类型感兴趣,可以使用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

【讨论】:

    【解决方案5】:

    为了描述我使用以下 sn-p 的模型

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

    同样,如果您正在寻找漂亮的印刷品来描述您 ActiveRecord,而无需在您能够很好地评论属性之前进行迁移或跳槽该开发人员。

    【讨论】:

    • 这非常适合打印特定模型的所有实例的所有属性 - 谢谢!
    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    相关资源
    最近更新 更多