【问题标题】:active record query over datetime array基于日期时间数组的活动记录查询
【发布时间】:2011-07-29 01:32:40
【问题描述】:

鉴于我有一组日期时间:

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

谢谢指教!

【问题讨论】:

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


    【解决方案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】:

      我猜date 实际上是数据库中的日期,而不是日期时间或时间戳。因此,您需要将 Ruby 日期时间转换为 Date 实例:

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

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

      【讨论】:

        【解决方案3】:

        您的代码在我看来不错,但您需要提供一个数组,如下所示:

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

        【讨论】:

        • 嘿谢谢您的回复。不幸的是,我得到了一个空数组。没有“[]”环境的结果相同
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-13
        • 2016-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多