Поддержание даты в порядке при использовании date_select и отбрасывание года в Rails? - PullRequest
0 голосов
/ 13 марта 2010

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

Мы используем 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 в моей модели продуктов. Но я не совсем уверен, как это сделать.

Идеи? У кого-нибудь когда-нибудь была эта проблема? Спасибо!

1 Ответ

0 голосов
/ 13 марта 2010

Добавьте before_save обратный вызов в вашей Product модели.

class Product < ActiveRecord::Base

  before_save :fix_end_date

  def fix_end_date
    self.end_date +=1.year if start_date > end_date
  end

end
...