SQL или RoR - Нахождение периода интервала для заданной даты начала и частоты - PullRequest
2 голосов
/ 31 марта 2020

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

Например, в блоге указано creation_date 6 января с input_frequency ежемесячно и input_limit из 4.

Я хотел бы знать 3 вещи относительно сегодняшней даты (скажем, это 10 июня):

  1. Что такое начало и дата окончания моего текущего интервала? (Пример ответа: с 6 июня по 6 июля)
  2. Сколько еще дней осталось до сброса моего предела ввода? (26 дней)
  3. Сколько постов было сделано за текущий интервал (на которые я могу легко ответить после того, как получу # 1 Posts.where(created_at: start_interval..end_interval)).

Стратегия между днями интервал недели, месяца и года может быть иным.

Например, с недельным интервалом было бы сложнее рассчитать интервал, так как мне нужно было бы рассчитать количество дней сегодня, начиная с creation_date, и делать по модулю и вычитать это по модулю из текущего дня в определите start_interval и добавьте 7 к нему, чтобы определить end_interval - есть ли какая-нибудь библиотека, которая делает все, что я хочу, или мне нужно самому выполнить все вычисления?

1 Ответ

0 голосов
/ 02 апреля 2020

Следующий код отвечает на мои 3 базовых c вопроса ... (хотя, вероятно, не самым эффективным способом, это ответ ...)

# assumes that date passed will always be later than start_date
def post_interval_start_date(date = Date.today)
    case input_frequency
    when "entire_duration"
        return creation_date
    when "daily"
        return date
    when "weekly"
        return date - ((date-creation_date).to_i%7).days
    when "monthly"
        # weird math here to account for months with different number of dates
        months_apart = (creation_date.year * 12 + creation_date.month) - (date.year * 12 + date.month)
        months_apart = months_apart-1 if start_date.mday > date.mday
        return creation_date+months_apart.months
    when "yearly"
        return Date.new(date.yday < start_date.yday ? date.year-1 : date.year, creation_date.month, creation_date.mday)
    end
end

def post_next_interval_start_date
    case input_frequency
    when "entire_duration"
        return post_interval_start_date
    when "daily"
        return post_interval_start_date+1.day
    when "weekly"
        return post_interval_start_date+1.week
    when "monthly"
        return post_interval_start_date+1.month
    when "yearly"
        return post_interval_start_date+1.year
    end
end

def post_left_this_period
    input_limit - post_posted_in_period
end

def post_posted_in_period
    posts.where('post_date >= ?', post_interval_start_date()).count
end

Что позволяет мне позвонить :

# answer #1 (i didn't end up needing end date for what i was doing):
blog.post_interval_start_date() 

# answer #2 
(blog.post_next_interval_start_date()-Date.today).to_i

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