#ruby-on-rails #rails-activerecord
#ruby-on-rails #rails-activerecord
Вопрос:
У меня есть приложение, в котором отчет запускается раз в неделю.
У меня есть модель отчета, которая управляет временем выполнения отчета и т.д. И сохраняет имя сгенерированной таблицы
Что я хочу сделать, так это создавать новую таблицу каждый раз, когда генерируется отчет.
У меня есть контроллер, создающий пользовательскую таблицу
Я создал случайное имя, используя table = ‘report_’ Digest::MD5.hexdigest(d), а затем reporter = Reporter.new_reporter(таблица) создает таблицу
def self.new_reporter(table)
ActiveRecord::Base.connection.create_table(table) do |t|
t.integer :period, :limit => 4
t.date :period_start_date
end
Это успешно создает таблицу, но проблема в том, что я не могу получить данные в эту динамически созданную таблицу.
Я создал модель под названием report_table и попытался использовать ReportTable.имя_таблицы = но не могу заставить это работать.
Как бы я создал новую строку в динамически именованной / созданной таблице?
Ответ №1:
Поскольку классы в Ruby являются только объектами типа Class
, вы можете динамически создавать их во время выполнения. Итак, я полагаю, что что-то подобное должно сработать:
# generate the the table name
report_table_name = 'report_' Digest::MD5.hexdigest(d)
# create the table
Reporter.new_reporter(report_table_name)
# dynamically create a Class object with AR as parent class
# and set the right table name
report_model = Class.new(ActiveRecord::Base)
report_model.table_name = report_table_name
# from here on you should be able to invoke any AR method on the dynamic class
report_model.create(period: 1, period_start_date: Time.now.to_date)
И чтобы сделать это более логичным, вы могли бы реализовать это в своем new_reporter
методе, чтобы он принимал имя таблицы, создавал таблицу и соответствующий ей класс AR и возвращал его.
Но в целом я бы еще раз обдумал ваш дизайн. Это решение может быть медленным и непонятным, в зависимости от того, как часто вы его используете.
Комментарии:
1. Спасибо, не знал, что вы можете динамически создавать класс. Я буду запускать его как фоновое задание, и время создания менее важно, чем для последующего отчета, поэтому я думаю, что это сработает. Позвольте мне дать этому оценку!
2. Добираясь туда, как вы динамически устанавливаете attr_accessible (rails 3.2.13)? Я попробовал report_model.accessible = : все, но это не удалось
3. Просто исправлен неправильный синтаксис — report_model.attr_accessible(:period, :period_start_date) Спасибо!!!