我正在使用日历 gem,它需要将 event.start_time 记录为“2023-11-07”。
我需要根据start_time找到本月和上个月的所有事件,其中event.rained_out == false
event.start_time[0,4].to_i == Time.now.year && event.start_time[5,2] == Time.now.month || event.start_time[5,2] == Time.now.month && event.rained_out== false
我不知道如何使用 activerecord 查询来实现这一点。
Event.where("start_time[5,2].to_i = ?", Time.now.month)
是语法错误
我知道数据库中的
start_time
列属于字符串类型,并且您希望查找日期以标识上个月或当前月份的特定字符串开头的所有行。
我首先为这些格式化的日期字符串前缀创建一个范围,如下所示:
date_prefixes = [1.month.ago, Time.current].map { |time| time.strftime('%Y-%m') }
#=> ["2023-10", "2023-11"]
prefixes_range = Range.new(*date_prefixes)
#=> "2023-10".."2023-11"
然后您可以将该范围传递给
ActiveRecord
查询以查找该范围内包含的所有字符串,如下所示:
Event.where(start_time: prefix_range)
将所有这些放在一个范围内:
# in app/models/event.rb
scope :started_this_or_previous_month, -> {
where(start_date: Range.new(*[1.month.ago, Time.current].map { |t| t.strftime('%Y-%m') })
}
# use scope like this:
Event.started_this_or_previous_month.where(rained_out: false)