Построить таблицу во время выполнения в Ruby on Rails - PullRequest
0 голосов
/ 29 января 2009

Как мне создать несколько таблиц базы данных во время выполнения, использующих одну и ту же модель, если rails хочет вывести имя таблицы из имени модели? Я хочу иметь возможность создать новый объект на основе модели, а затем создать новую таблицу с уникальным именем, на которое будет ссылаться объект. У кого-нибудь есть примеры или советы, которыми они могут поделиться, чтобы помочь мне найти решение?

Ответы [ 5 ]

4 голосов
/ 29 января 2009

Это звучит как архитектурная проблема - зачем вам хранить клоны одной модели вместо того, чтобы хранить их все в одной таблице?

В модели реляционной базы данных отношение - это то, что определяет строку или кортеж, то есть это набор атрибутов ключа. Любые другие подобные наборы атрибутов принадлежат одному и тому же отношению (таблица).

1 голос
/ 28 июня 2012

Нашел этот пост, когда искал решение для аналогичной проблемы: мне нужно сохранить сгенерированные пользователем данные отчета (сетка данных) в базе данных для дальнейшего редактирования / экспорта / и т.д. Я решил создать новую таблицу в БД для каждого отчета и обработать ее ORM. Ответ Натана помог, за исключением части eval, которая, я думаю, имеет отношение к текущему объему. Я пытался определить новый класс в методе экземпляра (хук after_save), поэтому, когда позже я ссылался на новую константу из другого метода, я получил NameError. Явная передача binding в eval тоже не помогла по неизвестной причине (неправильная привязка?), Поэтому я сделал это вместо:

klass = Class.new(ActiveRecord::Base) do
  # class body goes here
end

Object.const_set(class_name, klass)
1 голос
/ 02 декабря 2010
def self.create_table
    ActiveRecord::Schema.define do
      create_table :my_table_name do |t|
        #(define your columns just as you would in a migration file)
        t.string :my_string
      end
    end
end

(см. Документацию по методу define здесь .) (Я встречал этот ответ на rubyforums. Вот тема .)

1 голос
/ 29 января 2009

Не знаю, с какой стати вы захотите это сделать, но это возможно:

runtime_table_name = "random"

ActiveRecord::Migration.create_table(runtime_table_name) do
  # Table definition goes here
end

eval <<-EOS
  class #{runtime_table_name.classify} < YourBaseModel
    set_table_name #{runtime_table_name.inspect}
  end
EOS

runtime_model = runtime_table_name.classify.constantize
runtime_model.find(:all)

Вам просто нужно заменить YourBaseModel той моделью, на которой вы хотели бы видеть свои модели времени выполнения.

0 голосов
/ 29 января 2009

Создание таблицы возможно, наверное. Что-то вроде «CREATE TABLE newtab AS SELECT * FROM oldtab WHERE 0 = 1» выполняется с использованием ActiveRecord :: Base.connection.execute.

Затем вы можете каким-то образом выполнить set_table_name, чтобы указать вашу модель на созданную таблицу.

Это действительно помогло бы получить больше информации о том, какая проблема, по вашему мнению, у вас возникла, потребовала бы такого рода искаженного решения. Причина, по которой это трудно сделать в Rails, заключается в том, что вам действительно не нужно это делать. Я надеюсь, что есть более простая альтернативная архитектура.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...