Rails 5 Ruby 2.5.3 If для операторов, основанных на диапазонах месяцев - PullRequest
0 голосов
/ 01 февраля 2019

так что я работаю над личным проектом.

Я водитель грузовика и создаю простое приложение для отслеживания и расчета дохода и т. Д.

Что я пытаюсь сделать (и может быть, есть гораздо лучший способ сделатьэто) является основным моментом того, что моя текущая активная топливная надбавка основана только на диапазоне месяцев.

В этом случае с 1 апреля по 31 октября и с 1 ноября по 31 марта это может измениться в соответствии с требованиями контракта.

У меня есть столбцы activeDate и endDate в моей базе данных, и это то, что я придумал (но, похоже, не работает).

**<<index.html.erb>>**

      <tbody>
        <% @fscs.each do |fsc| %>
          <% if Date.today === (fsc.activeDate..fsc.endDate) %>
            <tr>
              <td class="fsc_active"><%= fsc.name %></td>
              <td class="fsc_active"><%= fsc.rate %></td>
              <td class="fsc_active"><%= fsc.activeDate %></td>
              <td class="fsc_active"><%= fsc.endDate %></td>
              <td><%= link_to 'View', fsc %></td>
              <td><%= link_to 'Edit', edit_fsc_path(fsc) %></td>
              <td><%= link_to 'Delete', fsc, method: :delete, data: { confirm: 'Are you sure?' } %></td>
            </tr>
          <% else %>
            <tr>
              <td class="fsc_inactive"><%= fsc.name %></td>
              <td class="fsc_inactive"><%= fsc.rate %></td>
              <td class="fsc_inactive"><%= fsc.activeDate %></td>
              <td class="fsc_inactive"><%= fsc.endDate %></td>
              <td><%= link_to 'View', fsc %></td>
              <td><%= link_to 'Edit', edit_fsc_path(fsc) %></td>
              <td><%= link_to 'Delete', fsc, method: :delete, data: { confirm: 'Are you sure?' } %></td>
            </tr>
          <% end %>
        <% end %>
      </tbody>

Любые советы о том, где я 'я ошибаюсь или указатели о том, как сделать это лучше, будет принята с благодарностью!Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

РЕДАКТИРОВАТЬ 1: Извините В этом случае имеет значение только месяц, а не год или день.мои извинения за то, что я не упомянул это.

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019
(fsc.activeDate..fsc.endDate).cover?(Date.today)

Вместо include? используйте cover?.Это существенно эффективнее.include? создаст целый массив всех возможных значений, чтобы увидеть, есть ли значение в списке.cover? просто использует минимальное и максимальное значения с >= и <=, чтобы увидеть, находится ли значение в пределах диапазона.В некоторых случаях cover? не является подходящей заменой для include?, но сейчас самое время использовать cover?.

https://ruby -doc.org / core-2.5.3 / Range.html # method-i-cover-3F

Я также рекомендовал бы хранить Date.today в переменной непосредственно перед началом цикла и использовать ее в своем сравнении вместопроверки текущего времени на сервере для каждого элемента в @fscs.

Кроме того, было бы разумно использовать Date.current вместо Date.today.Date.current - это метод Rails, который осведомлен о часовом поясе и дает вам сегодня информацию о настроенном в данный момент Time.zone.

Вот статья, которую я нашел полезной, чтобы узнать о том, какие методы использовать и каких методов избегать при работесо всеми развлечениями, которые идут с часовыми поясами.https://thoughtbot.com/blog/its-about-time-zones

0 голосов
/ 01 февраля 2019

Вы по-прежнему можете использовать FWIW с тройным равенством или регистром.Просто поменяйте аргументы на #===: вам нужен тот, который объявлен на Range, а не противоположный:

- Date.today === (fsc.activeDate..fsc.endDate)
+ (fsc.activeDate..fsc.endDate) === Date.today
0 голосов
/ 01 февраля 2019

Попробуйте сделать что-то вроде этого:

(fsc.activeDate..fsc.endDate).include?(Date.today)

Вы пытаетесь приравнять текущую дату к диапазону дат, в то время как вы хотите проверить, присутствует ли сегодняшняя дата в диапазоне дат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...