Метод подсчета Ruby: оценка хэша с ключом, который является датой

При тестировании метода рельсов с помощью Minitest следующее утверждение

Available.all.reload.pluck(:date).tally

возвращает следующий хеш

{Sat, 08 Jun 2024=>2, Tue, 25 Jun 2024=>12, Sun, 07 Jul 2024=>11}

Утверждение, которое предпринимается, заключается в том, чтобы после преобразования данных проверить, что значение ключа даты 2024-07-07 == 11.
Следующее, если предположить, что хеш-ключи являются экземплярами Time, возвращает false;
существует проблема с вводом даты либо в операторе, либо при его преобразовании в консоль.

new_date = DateTime.new(2024,7,8,0,0,0).to_time
assert Available.all.reload.pluck(:date).tally.include?({new_date=>11})

Как это должно быть написано?

🤔 А знаете ли вы, что...
Ruby on Rails активно использует принцип DRY (Don't Repeat Yourself), что способствует уменьшению дублирования кода.


1
54
1

Ответ:

Решено

...при условии, что хэш-ключи являются экземплярами Time

Судя по сообщению, это не экземпляры Time, которые будут представлены через inspect как «%Y-%m-%d %H:%M:%S.%6N %z», вместо этого они кажутся объектами Date.

Первое, что я бы порекомендовал, это

Available.all.reload.pluck(:date).tally

Эквивалентно

Available.group(:date).count

Это разгружает подсчет в базу данных и позволяет избежать создания промежуточного Array

Во-вторых, вы можете создать объект Date, используя Date.new(2024,7,8).

Поскольку мы используем Hash, мы можем просто найти ключ и сравнить значение следующим образом:

Available.group(:date).count[Date.new(2024,7,8)] == 11

При этом, если целью всегда является один Date и Hash не требуется, то что-то вроде этого может быть более эффективным:

Available.where(date: Date.new(2024,7,8)).count == 11