Как мне обрабатывать данные, которые должны сохраняться в базе данных, но не являются надлежащей моделью, в Ruby on Rails?
-
02-07-2019 - |
Вопрос
Представьте себе веб-приложение, написанное на Ruby on Rails.Часть состояния этого приложения представлена в виде фрагмента данных, который не соответствует описанию модели.Этот дескриптор состояния должен сохраняться в той же базе данных, что и модели.Его отличие от модели заключается в том, что должен существовать только один экземпляр его класса и у него нет связей с другими классами.
Кто-нибудь сталкивался с чем-нибудь подобным?
Решение
Судя по вашему описанию, я думаю, что плагин rails-settings должен делать то, что вам нужно.
Из Readme:
"Настройки - это плагин, который упрощает управление таблицей глобальных пар ключ-значение.Думайте об этом как о глобальном хэше, хранящемся в вашей базе данных, который использует простые методы, подобные ActiveRecord, для манипулирования.Следите за любыми глобальными настройками, которые вы не хотите жестко кодировать в своем приложении rails.Вы можете хранить объекты любого типа.Строки, числа, массивы или любой другой объект."
Другие советы
Если это данные, и они есть в базе данных, то это часть модели.
На самом деле это не проблема RoR;это общая проблема проектирования OO.
Если бы это был я, я бы, вероятно, нашел способ концептуализировать данные как модель, а затем просто сделал их синглтоном с помощью фабричного метода и частного конструктора.
В качестве альтернативы, вы могли бы рассматривать это как форму ведения журнала.В этом случае у вас просто был бы класс Logger (также singleton), который считывает / записывает базу данных напрямую и вызывается в начале и конце каждого запроса.
В Rails, если данные находятся в базе данных, то они находятся в модели.В этом случае модель может называться "Configuration", но она по-прежнему сопоставлена классу ActiveRecord в вашей системе Rails.
Если эти данные действительно статичны, возможно, вам вообще не понадобится база данных.Вы могли бы использовать (в качестве примера) переменную в вашем прикладном контроллере:
class ApplicationController < ActionController::Base
helper :all
@data = "YOUR DATA HERE"
end
Существует несколько подходов, которые можно использовать для создания экземпляра данных для использования в приложении Rails.
Я не уверен, что понимаю, почему вы говорите, что это не может вписаться в модель Rails.
Если это просто сложная структура данных, просто сохраните кучу кода Ruby в текстовом поле в базе данных :-)
Если, например, у вас есть сложный вложенный хэш, который вы хотите сохранить, назначьте следующее текстовому полю "данные":
ComplexThing.data = complex_hash.inspect
Когда вы захотите перечитать его еще раз, просто
complex_hash = eval ComplexThing.data
Позвольте мне указать еще на 2 момента, касающиеся этого решения:
- Если ваша структура данных не является стандартными классами Ruby, простая проверка может этого не сделать.Если вы где-нибудь видите #<MyClass:0x4066e3c> , что что-то не сериализуется должным образом.
- Это наивная реализация.Возможно, вы захотите ознакомиться с реальными решениями маршалинга, если вы рискуете получить данные в юникоде или если вы действительно сохраняете много пользовательских классов.