Нахождение текущей академии c год - PullRequest
0 голосов
/ 05 мая 2020

Я хочу определить, соответствует ли дата текущему c академическому году. Для этого я написал функцию для определения текущего c академического года. Есть ли лучший способ сделать это?

# returns start and end date of current academic year
    def academic_year
         # assumption: an academic year is from sept 1st untill sept 1st
        start_date = Date.parse "#{Time.current.year}-09-01"
        end_date   = Date.parse "#{Time.current.year+1}-09-01"

        if Date.today < start_date
            start_date = Date.parse "#{Time.current.year-1}-09-01"
            end_date   = Date.parse "#{Time.current.year}-09-01"
        end

        {start: start_date, end: end_date}
    end

Ответы [ 2 ]

3 голосов
/ 05 мая 2020

В Ruby вы должны использовать Range # cover?

# see https://api.rubyonrails.org/classes/Date.html
start = Date.current.change(month: 9, day: 1)
academic_year = start..start.advance(years: 1)

academic_year.cover?(Date.current.change(month: 6, day: 15)) # false
academic_year.cover?(Date.current.change(month: 10, day: 2).advance(years: 2)) # false
academic_year.cover?(Date.current.change(month: 10, day: 2)) # true

Но обычно вы должны запрашивать по дате в базе данных, и в этом случае вы передаете диапазон .where для создания запроса BETWEEN:

Order.where(placed: 2.years.ago..Time.current)
# SELECT "orders".* FROM "orders" WHERE "orders"."placed" BETWEEN $1 AND $2 LIMIT $3
0 голосов
/ 22 мая 2020

Это то, что мы придумали. Я думаю, немного менее читабельно.

def academic_year
  start = (Date.today.month >= 9) ? Date.civil(Date.today.year, 9, 1) : Date.civil(Date.today.year - 1, 9, 1)

  {start: start, end: 1.year.since(start)}
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...