В моем приложении есть пользователи, у которых есть сезонные продукты. Когда пользователь выбирает продукт, мы позволяем ему также выбрать сезон продукта. Мы достигаем этого, позволяя ему выбрать дату начала и дату окончания для каждого продукта.
Мы используем date_select
для создания двух наборов раскрывающихся списков: один для даты начала и один для даты окончания.
Включая годы не имеет смысла для нашей модели. Поэтому мы используем опцию: discard_year => true
Чтобы объяснить нашу проблему, представьте, что наша продукция - яблоки. Продавец X перевозит яблоки каждый год с сентября по январь. Годы здесь не имеют значения, и поэтому мы используем discard_year => true
. Однако, хотя конкретные годы не имеют значения, относительный момент времени от начальной даты до конечной даты имеет значение. Вот где возникает наша проблема.
Когда вы используете discard_year => true
, Rails устанавливает год в базе данных, он просто не отображается в представлениях. Rails устанавливает все годы на 0001 в нашем приложении. Возвращаясь к нашему примеру с яблоком, это означает, что база данных теперь думает, что пользователь выбрал сентябрь 0001 - январь 0001. Это проблема для нас по ряду причин.
Чтобы решить эту проблему, необходимо реализовать следующую логику:
Если месяц / день сезона_старт численно находится перед месяцем / днем сезона / концом, тогда подойдет стандартный подход Rails.
Но, если month_start month / day численно ПОСЛЕ season_end month / day, то мне нужно динамически обновить поле базы данных таким образом, чтобы год для season_end был равен году для season_start + 1. Например, если пользователь выбирает с 15 октября по 15 января, то, что он намерен сделать, это с 15 октября 0001 по 15 января 2000 года. Мне нужно приложение, чтобы отразить это.
Мое лучшее предположение - я бы создал собственный метод, который будет работать как after_save
или after_update
в моей модели продуктов. Но я не совсем уверен, как это сделать.
Идеи? У кого-нибудь когда-нибудь была эта проблема? Спасибо!