Таблица данных динамического отчета

#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) Спасибо!!!