2011-07-29 145 views
0

鉴于我有日期时间的数组:活动记录查询

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 

Thx建议!

回答

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) } 
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秒的差异,它不会起作用。

+0

嘿thx为您的答复。不幸的是我得到一个空数组。没有“[]”环境的结果相同 – daniel

1

我猜date实际上是在数据库中的日期,而不是日期时间或时间戳。所以,你需要转换你的Ruby日期时间,只是日期实例:

def self.booked(array) 
    where("date NOT IN (?)", array.map(&:to_date)) 
end 

如果不将它们转换成手的日期,AR不会知道它应该将它们转换到日期数据库;那么,根据底层数据库,您可能会得到空的结果或可能的错误。