Конвертировать текст в код - PullRequest
2 голосов
/ 30 января 2011

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

О, и эти правила все время меняются, поэтому кодирование их в приложении на самом деле не вариант для меня.

Я надеялся сохранить код метода validate в базе данных. Каждая конфигурация будет иметь свою собственную версию проверки, которая будет храниться в виде текста в БД и может быть изменена, если / когда потребуется.

Возможно ли это сделать? Как я могу взять текст и заставить рельсы действительно выполнить то, что говорит этот текст?

Например, у меня есть это:

irb(main):246:0> @h= Configuration.find(1).rule
=> "def getmax3(inputarray)\n    @maxpos = 0\n    inputarray.each do |h|\n      if @maxpos < h.position\n      @maxpos = h.position\n      end\n    end\n    1\n end"

который не является кодом. Приведенный выше метод, конечно, является всего лишь тестом, поскольку я пытаюсь разобраться.

(О, и я знаю, что делать это, должно быть, ужасно, но я действительно не могу придумать другого пути)

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 30 января 2011

Возможно, я неправильно понимаю вашу проблему, но если вы сможете вытащить этот код из базы данных и в файлы, которые можно протестировать и создать версии, вы окажетесь в гораздо более счастливом месте. Не зная тонкостей ваших моделей, сложно сказать, каким будет лучший подход, но я гарантирую, что он есть.

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

Базовый родительский класс будет просто наследоваться от ActiveRecord:

class Configuration < ActiveRecord::Base
end

Тогда каждый подкласс будет иметь свою логику, определенную в нем:

class Component < Configuration
  def getmax3(inputarray)
    @maxpos = 0
    inputarray.each do |h|
      if @maxpos < h.position
        @maxpos = h.position
      end
    end
    1
  end
end

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

1 голос
/ 30 января 2011

Да, это ужасная практика:)

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

Вот мое предложение:

  • Настройка процедуры автоматического развертывания с использованием capistrano и других инструментов
  • Запишите свои правила в специальной библиотеке проверки
  • Код и правила тестирования, фиксация и развертывание

ОпределениеDSL может облегчить вашу жизнь, если вы в долгосрочной перспективе намерены манипулировать такими правилами, и вы не можете быть единственными, кто отвечает за такую ​​задачу;понаблюдайте, как правила меняются в течение длительного времени, и вы узнаете, является ли использование выделенного DSL полезным или бесполезной тратой времени.

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