Вопрос по activerecord, ruby, ruby-on-rails – Получить имя таблицы из ActiveRecord

22

я использовалActiveRecord::Base.set_table_name установить имя моей таблицы на динамически создаваемый класс ActiveRecord. Теперь мне нужно знать, как получить это значение позже. В api docs ничего не сказано о том, как это сделать. Кроме того, я не могу получить имя таблицы из имени класса ActiveRecord, потому что они имеют ключи, отличные от имени таблицы.

Вот лучший пример того, что я делаю

<code>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
</code>

В этом случае, еслиconst_name = Test и имя базы данных - Database, она должна создать класс ActiveRecord :: Base :: DatabaseTest, что она и делает. Но когда я вызываю table_name, я получаю неопределенную локальную переменную или метод. Нужно ли вызывать table_name в классе?

Update: Я получил это работает, позвонивinstance.class.table_name

Ваш Ответ

4   ответа
8
class User < ActiveRecord::Base
end

User.table_name 
# 'users'
1

что есть более элегантный способ, но самое простое решение - Eval

my_class_name = "MyNewARClass"
my_class_table_name = "MyDatabase"
eval %{
    class #{my_class_name} < ActiveRecord::Base
         self.table_name = "#{my_class_table_name}" 

    end
  }
10

Я использовал следующий код рельсов:

my_record = Record.id(0) # hypothetical code
table_name = my_record.class.table_name
Поздно, но это работает!
почему не простоRecord.table_name как предлагали другие ответы? : Thumbdown:
34

table_name? Документы.

Ах, извините, я немного не в себе с таким количеством мета. Все, что я могу вам сказать, этоtable_name это метод класса наActiveRecord::Base (и, следовательно, его производные классы), полученные изActiveRecord::ModelSchema::ClassMethods.
Я пробовал это, это говорит неопределенный метод. Я должен быть немного яснее. Я метапрограммирую создание этого класса. Я добавляю более четкий пример к моему вопросу MobileOverlord

Похожие вопросы