对datetime数组的活动记录查询

时间:2011-07-29 01:32:40

标签: ruby-on-rails ruby-on-rails-3 activerecord

鉴于我有一组日期时间:

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

建议!

3 个答案:

答案 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将不知道它应该将它们转换为数据库的日期;然后,根据底层数据库,您可能会得到空结果或可能出错。

相关问题