鉴于我有一组日期时间:
array = [Sat, 30 Jul 2011 00:00:00 CEST +02:00, Sat, 30 Jul 2011 00:15:00 CEST +02:00, Sat, 30 Jul 2011 00:30:00 CEST +02:00, Sat, 30 Jul 2011 00:45:00 CEST +02:00
我希望我的模型类方法返回不匹配的日期时间(未安排)
Sat, 30 Jul 2011 00:00:00 CEST +02:00
#appointment.rb (with colum `date` as DateTime)
def self.booked(array)
where("date NOT IN (?)", array)
end
建议!
答案 0 :(得分:1)
您的代码对我来说很好,但您需要提供一个数组,如下所示:
where(['date NOT IN(?)', array])
以下是带有日期列
的网络研讨会课程的示例>> array = Webinar.all[0..2].map(&:date)
=> [Wed, 04 May 2011 02:16:00 PDT -07:00, Tue, 05 Apr 2011 06:00:00 PDT -07:00, Thu, 30 Jun 2011 07:30:00 PDT -07:00]
>> count_without_array = (Webinar.count - array.size)
>> Webinar.where(['date NOT IN(?)', array]).count == count_without_array
=> true
请记住,日期必须完全匹配,如果有1秒差异则无法正常工作。
答案 1 :(得分:1)
这是因为您的阵列格式不正确:
array = [Sat, 30 Jul 2011 00:00:00 CEST +02:00, Sat, 30 Jul 2011 00:15:00 CEST +02:00, Sat, 30 Jul 2011 00:30:00 CEST +02:00, Sat, 30 Jul 2011 00:45:00 CEST +02:00
注意它将日子分开作为单独的元素。或者你这样做?如果没有,您应该将它们全部转换为实际的DateTime
个对象(可能使用#parse
),然后将它们放入数组中。
此外,您可能希望将该方法放入范围:
scope :booked, lambda { |datetimes| where("date NOT IN (?)", datetimes) }
答案 2 :(得分:1)
我猜测date
实际上是数据库中的日期,而不是日期时间或时间戳。因此,您需要将Ruby Datetimes转换为Date实例:
def self.booked(array)
where("date NOT IN (?)", array.map(&:to_date))
end
如果您不手动将它们转换为日期,AR将不知道它应该将它们转换为数据库的日期;然后,根据底层数据库,您可能会得到空结果或可能出错。