Я создаю простое приложение для обследования Ruby on Rails для проекта психологического опроса друга.Итак, у нас есть опросы, у каждого опроса есть куча вопросов, и у каждого вопроса есть один из вариантов, которые могут выбрать участники.Ничего захватывающего.
Одним из интересных аспектов является то, что с каждым вариантом ответа связано значение оценки.И поэтому для каждого опроса необходимо рассчитать общий балл на основе этих значений.
Теперь моя идея состоит в том, чтобы вместо жестких вычислений дать пользователю возможность добавить формулу, по которой будет рассчитываться общий балл опроса.Примеры формул:
"Q1 + Q2 + Q3"
"(Q1 + Q2 + Q3) / 3"
"(10 - Q1) + Q2 + (Q3 * 2)"
Так что просто базовая математика (с некоторыми дополнительными скобками для ясности).Идея состоит в том, чтобы сделать формулы очень простыми, чтобы каждый, кто имеет базовую математику, мог вводить их без разрешения какого-либо необычного синтаксиса.
Моя идея состоит в том, чтобы взять любую данную формулу и заменить заполнители, такие как Q1, Q2 и т. Д., Назначения баллов основаны на том, что выбрал участник.И затем eval () вновь сформированная строка.Примерно так:
f = "(Q1 + Q2 + Q3) / 2" # some crazy formula for this survey
values = {:Q1 => 1, :Q2 => 2, :Q3 => 2} # values for substitution
result = f.gsub(/(Q\d+)/) {|m| values[$1.to_sym] } # string to be eval()-ed
eval(result)
Итак, мои вопросы:
Есть ли лучший способ сделать это?Я открыт для любых предложений.
Как работать с формулами, в которых не все заполнители были успешно заменены (например, на один вопрос не было ответа)?Пример: {:Q2 => 2}
не был в хэше значений?Моя идея состояла в том, чтобы спасти eval (), но он не потерпит неудачу в этом случае, потому что coz (1 + + 2) / 2
все еще может быть eval () - ed ... есть мысли?
Как получитьправильный результат?Должно быть 2.5, но из-за целочисленной арифметики оно будет усечено до 2. Я не могу ожидать, что люди, которые предоставляют правильную формулу (например, / 2.0), поймут этот нюанс.
Iне ожидайте этого, но как лучше защитить eval () от злоупотреблений (например, неверная формула, манипулируемые значениями)?Пример: f = 'system("ruby -v"); (Q1 + (Q2 / 3) + Q3 + (Q4 * 2)) / 2 '
Спасибо!