Pull to refresh

Ruby — хранение части кода в базе данных

Reading time1 min
Views651
Сегодня нашел еще один способ как можно использовать «фишку» интерпретируемых языков — создавать и выполнять программный код в процессе работы программы.

Можно положить часть кода в базу данных.

Для чего это нужно?

Мне встретилась такая задача — писать онлайн тесты.
У каждого теста есть функция — по которой ответам пользователя ставится в соответствие — номер описания результата

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

и теперь в месте, где нужно рассчитать результат теста пишем:
eval(@test.function)

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

Правда если внутри строки, передаваемой eval объявить локальную переменную, то внешняя программа ее не будет видеть (по крайней мере у меня не увидела, хотя в консоли все было ок), поэтому лучше пользоваться переменными экземпляра (instance variables) вида — @varname

Подозреваю справедливую критику со стороны любителей строгого ООП. Но приводить этот пример в согласие с ООП я не буду, если есть желание — поэкспериментируйте.
Tags:
Hubs:
Total votes 16: ↑5 and ↓11-6
Comments23

Articles