2011-01-30 4 views
2

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

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

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

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

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

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" 

который obviosly не код. Метод выше, конечно, просто тест, поскольку я пытаюсь понять вещи.

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

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

ответ

1

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

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

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

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

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

+0

Спасибо за ваш ответ. Я новичок RoR, поэтому предложение кажется долгим от реальности. Где я могу хранить эту конфигурационную библиотеку? Это что-то, что я вложил в приложение в виде файла? в папке Lib? – Lievcin

+0

Начните как можно проще. Являются ли эти правила правилом проверки? поместите их в свою модель. Что-то связано с рабочим процессом вашего приложения? сделайте контроллер своим домом. Вы позже решите сами. – lbz

1

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

В прошлом я использовал одностраничное наследование для моделирования сложных систем, имеющих связанные компоненты, которые имеют общие свойства и поведение. Возможно, вы сможете использовать этот подход для своего приложения. 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 

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

Смежные вопросы