Я создаю систему, которая должна обеспечить, чтобы запланированные «поездки» не пересекались.Для этого я пытаюсь проверить дату начала и окончания, чтобы убедиться, что они не входят в даты начала и окончания другой поездки.
class TripdateValidator < ActiveModel::EachValidator
def validate_each(object, attribute, value)
# Check value exists as end_date is optional
if value != nil
parsed_date = Date.parse(value)
# is the start date within the range of anything in the db
trips = Trip.where(['start_date >= ? AND end_date <= ? AND user_id = ?', parsed_date, parsed_date, object.user_id])
# overlapping other trips, aghhh
object.errors[attribute] << 'oh crap' if trips
end
end
end
Дата поступает из поля type = "date", котороеработает на основе jQuery UI Datepicker и содержит формат 2011-01-01.Это относится к рельсам как 2011-01-30 00:00:00 UTC, что я не совсем понимаю.
Если я пытаюсь использовать Date.parse () для этого значения, это выдает ошибку:
TypeError в TripsController # create
$ _ значение должно быть String (не указано)
Rails.root:
/ Users / phil / Sites / travlrapp.com
Трассировка приложений |Framework Trace |
Full Trace
app / models / trip.rb: 29: в
validate_each'<br>
app/controllers/trips_controller.rb:75:in
создать '
app / controllers / trips_controller.rb: 74: в
`create '
Всякий раз, когда я запускаю запрос, ничего не возвращается.Может ли это быть проблемой формата даты, моя логика нарушена или я делаю что-то действительно глупое?Застрял на этом некоторое время, и Google не поможет.
Редактировать Люди сосредоточены на ошибке Date.parse, но это не главная проблема.Я застрял в том, что я не понимаю, как проводить сравнения дат, когда все в совершенно разных форматах.
Я поменял Date.parse () на Chronic.parse (), и теперь я получаю следующееСгенерированные запросы SQL:
SELECT "trips".* FROM "trips" WHERE (start_date >= '2011-01-26 00:00:00.000000' AND end_date <= '2011-01-26 00:00:00.000000' AND user_id = 19)
Это ничего не возвращает.Даты, с которыми я проверяю:
начало: 2011-02-17 00: 00: 00.000000 конец: 2011-02-21 00: 00: 00.000000
Видя, как я думаю, датытеперь правильно отформатирован, это больше похоже на проблему логики.Как, черт возьми, я могу проверить перекрывающиеся даты>.