Я работаю над приложением Rails с некоторыми бюджетными функциями ...
Я хочу разрешить пользователям создавать Budget
и указывать дату начала и интервал (например, «Ежемесячно»)."," Ежеквартально "," Ежегодно "и т. Д.).Из этого я не хочу строить BudgetPeriod
, первый из которых начинается с заданной даты начала и имеет длительность "интервала".Следующий период начинается там, где заканчивается предыдущий, и поэтому он должен продолжаться с течением времени ...
Простое решение, которое я нашел для этого, состояло в том, чтобы сохранить интервалы в виде строковых представлений объектов Duration
, поэтомуЕжемесячно будет "1.month" и ежеквартально "3.months".А затем используйте eval(interval)
, чтобы вычислить даты начала и окончания периодов, как это
after_create :create_periods
def create_periods
period_start = self.starting_at
while period_start <= Date.today
next_start = period_start + eval(self.interval)
period_end = next_start - 1.day
budget_periods.create(start_date: period_start, end_date: period_end)
period_start = next_start
end
end
Это работает очень хорошо, но у меня такое ощущение, что использование eval () как это и в основном сохранение кода в базе данных неправильный путь.
Итак, это плохая практика или я должен продолжать?