【问题标题】:Get table name from ActiveRecord从 ActiveRecord 获取表名
【发布时间】:2012-04-26 13:10:02
【问题描述】:

我使用ActiveRecord::Base.set_table_name 在动态创建的 ActiveRecord 类上设置我的表名。现在我需要知道以后如何获得该值。 api 文档没有提到如何做到这一点。此外,我无法从 ActiveRecord 类名中派生表名,因为它们的键控方式与表名不同。

这是我正在做的一个更好的例子

table_klass = Class.new(ActiveRecord::Base)
    ActiveRecord::Base.const_set(const_name,table_klass)
    app = @app
    table_klass.class_eval do
      after_save do
        @@channel.push self
      end
      set_table_name t.server_table
      establish_connection(
        :adapter  => "mysql2",
        :host     => app.db_host,
        :username => app.db_user,
        :password => app.db_pass,
        :database => app.db_name
      )
    end

在这种情况下,如果const_name = Test 并且数据库名称是 Database,它应该创建一个 ActiveRecord::Base::DatabaseTest 类,它会这样做。但是当我在它上面调用 table_name 时,我得到未定义的局部变量或方法。我需要在课堂上调用 table_name 吗?

更新: 我打电话给instance.class.table_name

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    你试过table_name吗? Docs.

    【讨论】:

    • 我试过这个,它说未定义的方法。我应该清楚一点。我正在元编程这个类的创建。我正在为我的问题添加一个更清晰的示例
    • 啊,对不起,我对这么多的元数据有点不知所措。我只能告诉你table_nameActiveRecord::Base(以及它的派生类)上的一个类方法,从ActiveRecord::ModelSchema::ClassMethods 获得。
    • Rails 再次通过了最小惊讶原则。
    【解决方案2】:

    聚会迟到了。

    我使用了以下 Rails 代码:

    my_record = Record.id(0) # hypothetical code
    table_name = my_record.class.table_name
    

    【讨论】:

    • 为什么不像其他答案所建议的那样只是Record.table_name? :thumbdown:
    【解决方案3】:
    class User < ActiveRecord::Base
    end
    
    User.table_name 
    # 'users'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 2014-09-09
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多