SQL或RoR-查找给定开始日期和频率的间隔周期
存在一个博客模型,它具有SQL或RoR-查找给定开始日期和频率的间隔周期,sql,ruby-on-rails,Sql,Ruby On Rails,存在一个博客模型,它具有创建日期,输入频率,以及输入限制。输入频率可以是每天、每周、每月(忽略该月内的天数,但在下一个月的下一个月的第二天重置)或年(忽略该年内的天数,但在下一年的同一天重置)。在由input\u frequency和creation\u date确定的给定时间段内,允许用户发布到设置的input\u limit 例如,该博客的创建日期为1月6日,input\u频率为每月,input\u限制为4 我想知道与今天日期相关的三件事(假设是6月10日): 我当前间隔的开始和结束日期是什
创建日期
,输入频率
,以及输入限制
。输入频率可以是每天、每周、每月(忽略该月内的天数,但在下一个月的下一个月的第二天重置)或年(忽略该年内的天数,但在下一年的同一天重置)。在由input\u frequency
和creation\u date
确定的给定时间段内,允许用户发布到设置的input\u limit
例如,该博客的创建日期为1月6日,input\u频率为每月,input\u限制为4
我想知道与今天日期相关的三件事(假设是6月10日):
我当前间隔的开始和结束日期是什么?(示例答案:6月6日至7月6日)
在输入限制重置之前还有多少天?(26天)
在当前时间间隔内发表了多少篇文章(在获得#1posts.where(创建时间:start\u interval..end\u interval)
后,我可以轻松回答)
日、周、月和年间隔之间的策略似乎必须有所不同
例如,以每周为间隔,计算时间间隔似乎比较困难,因为我必须计算今天的天数是从创建日期开始的
,然后进行模运算,然后从当天减去模运算来确定开始时间间隔,再加上7来确定结束时间间隔-是否有任何库可以做我想做或我想做的事情必须自己完成所有的计算吗?下面的代码回答了我的3个基本问题。。。(虽然可能不是最有效的方式,但这是一个答案…)
像7.days.ago
,7.days.from\u now
,Date.today.start\u of\u week
这样的方法对你有用吗?
# 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