【问题标题】:Rails console throwing error for ActiveRecord::Base.connection.table_structure("<table name>")Rails 控制台为 ActiveRecord::Base.connection.table_structure("<table name>") 抛出错误
【发布时间】:2016-11-15 22:01:49
【问题描述】:

我正在尝试通过以下命令访问表结构:

ActiveRecord::Base.connection.table_structure("projects")

控制台抛出如下错误:

NoMethodError: 为 #

调用了受保护的方法 `table_structure'

我想知道 Rails 控制台是如何工作的,以及这个错误背后的原因是什么?有什么方法可以通过 Rails 控制台访问表结构,而不是经常切换到 Sqlite3 来检查架构?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    调用你想要的方法:

    ActiveRecord::Base.connection.send(:table_structure, "projects")
    

    但我认为更好的选择是使用columns_hash 来获取有关表结构的最详细信息:

    获取表的列作为哈希,键是列名,值是 列对象。

    Project.columns_hash
    

    用法:比如说,您想获取有关id 列的信息:

    Project.columns_hash['id']
    #=> #<ActiveRecord::ConnectionAdapters::PostgreSQLColumn:0x007fda9e48ce90
    # @array=false,
    # @cast_type=#<ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer:0x007fda9bda2e88 @limit=nil, @precision=nil, @range=-2147483648...2147483648, @scale=nil>,
    # @default=nil,
    # @default_function="nextval('users_id_seq'::regclass)",
    # @name="id",
    # @null=false,
    # @sql_type="integer">
    

    还有columns

    返回与此关联的表的列对象数组 类。

    column_names:

    以字符串形式返回一个列名数组。

    Project.columns
    Project.column_names
    

    请参阅full list of methods in documentation

    【讨论】:

    • NoMethodError: undefined method 'table_structure' for #&lt;ActiveRecord::ConnectionAdapters::PostgreSQLAdapter:0x000000055d9918&gt; 使用发送
    • @Deepak OP 使用 SQLite3 :)
    • @AndreyDeineko 你能解释一下控制台提供受保护方法的原因吗?
    • @Kartikey 我无法确定原因,因为我没有编写代码,但是当代码作者不希望任何人使用此方法时,就会发生这种情况。我真的认为您最好使用公共 API 中的一种方法(请参阅我的答案中的方法和我提供的链接)
    【解决方案2】:

    只需输入模型名称即可直接获取结构

    你的情况

    Project
    

    这将返回如下内容:

    class Project < ActiveRecord::Base {
              :id => :integer,
            :name => :string,
      :created_at => :datetime,
      :updated_at => :datetime
    }
    

    【讨论】:

    • 您能否解释一下为什么这种方法不起作用?
    • 它在错误中说table_structure是一个受保护的方法
    • @Kartikey 我展示了如何调用您需要的方法以及替代方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多