Это подход, который требует мое приложение.Приложение предоставляет веб-интерфейс на ряд удаленных встроенных устройств, которые в свою очередь контролируют датчики.Каждое встроенное устройство запускает клиентский процесс ruby, который считывает файл конфигурации, чтобы определить его настройку.Необходимо добавить новый тип датчика.
У меня есть подход, который заключается в том, что каждый тип датчика имеет свою собственную таблицу данных, в которую записывается каждое устройство, имеющее этот датчик.Поэтому, чтобы иметь возможность создавать новый тип датчика, мне нужно иметь возможность устанавливать новые таблицы.
Одна из первых проблем заключается в том, что на удаленных встроенных устройствах нет приложения rails - поэтому таблицаплюрализм имен плохой план, так как правила плюрализации недоступны для удаленных устройств.Поэтому я установил
ActiveRecord::Base.pluralize_table_names = false
в config / environment.rb
Данные о каждом типе сенсорного устройства хранятся в модели SensorType, которая имеет два поля - имя сенсора и конфигсодержимое файла.
Внутри класса модели SensorType есть методы для:
- Анализ файла конфигурации для извлечения имен и типов полей
- Создание миграции для построения новой модели
- Изменение определенного поля в БД из общей строки в char (17), так как это MAC-адрес, используемый для индексации
- Изменение нового кода модели для добавления соответствующих отношений own_to
- Создание частичных шаблонов для вывода данных в таблицу (частичный заголовок и частичный элемент line_item)
Все эти методы связаны друг с другом методом create_sensor_table, который вызывает все вышеперечисленное и выполняетсоответствующие операторы require или load для обеспечения немедленной загрузки новой модели.Это вызывается из метода создания в SensorTypeController следующим образом:
# POST /device_types
# POST /device_types.xml
def create
@sensor_type = SensorType.new(params[:sensor_type])
respond_to do |format|
if @sensor_type.save
@sensor_type.create_sensor_tables
flash[:notice] = 'SensorType was successfully created.'
#etc