Не было бы логики, как это было бы лучше
подходит для модели? Жирная модель,
тощий контроллер?
Я думаю, что это абсолютно правильно. Я презираю использование контроллера для подобных вещей. На мой взгляд, контроллеры лучше всего использовать для нескольких вещей:
- Перетасовка данных между видами и моделями, аля операции CRUD
- Контроль доступа (обычно с before_filters)
- Поддержка необычных действий пользовательского интерфейса (множественный выбор, мастера и т. Д.)
Конечно, каждый должен найти свой собственный баланс, но я считаю, что «создание исключения» приводит к тому, что исключения повсеместно приводят к исключениям. Не говоря уже о том, что логику контроллера сложнее проверить.
Чтобы ответить на ваш вопрос: вы должны просто определить виртуальные атрибуты в вашей модели, которые помогут вам конвертировать между start_at и длительностью. Что-то вроде:
# Return the duration in seconds. Will look different if you want to use
# multiparameter assignment (which you definitely should consider)
def duration
(end_at - start_at).seconds
end
# Store the duration as an instance variable. Might need to use multiparameter
# assignment if you use a time_select() in the view.
def duration=(arg)
@duration = arg
end
before_save :set_end_at
def set_end_at
end_at = start_at + @duration.seconds
end
Я бы обычно устанавливал фактический атрибут в before_save, чтобы избежать каких-либо условий гонки из назначения формы. У вас нет гарантии, что start_at будет назначен до или после продолжительности, и это может привести к ошибкам в вашей в противном случае хорошей логике.