Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有postgresql:extract字段的Rails从时间上不起作用_Sql_Ruby On Rails_Ruby_Postgresql_Activesupport - Fatal编程技术网

带有postgresql:extract字段的Rails从时间上不起作用

带有postgresql:extract字段的Rails从时间上不起作用,sql,ruby-on-rails,ruby,postgresql,activesupport,Sql,Ruby On Rails,Ruby,Postgresql,Activesupport,我在按小时订购收藏品方面有问题。但首先要做的是 项目详情: Rails version 5.1.3 Ruby version 2.4.1-p111 (x86_64-linux) Database adapter postgresql 我的收藏是这样的: #<DeliveryTimeslot:0x00562dd1ad2690 id: 1, start: Sun, 02 Jan 2000 01:00:00 +03

我在按小时订购收藏品方面有问题。但首先要做的是

项目详情:

Rails version             5.1.3
Ruby version              2.4.1-p111 (x86_64-linux)
Database adapter          postgresql
我的收藏是这样的:

 #<DeliveryTimeslot:0x00562dd1ad2690
  id: 1,
  start: Sun, 02 Jan 2000 01:00:00 +03 +03:00,
  stop: Sun, 02 Jan 2000 02:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:39 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:25 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1abcf98
  id: 2,
  start: Sun, 02 Jan 2000 02:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 03:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:39 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:25 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1ad23c0
  id: 3,
  start: Sat, 01 Jan 2000 03:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 04:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:39 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1ad1e70
  id: 4,
  start: Sat, 01 Jan 2000 04:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 05:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1ad1470
  id: 5,
  start: Sat, 01 Jan 2000 05:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 06:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1ad0bd8
  id: 6,
  start: Sat, 01 Jan 2000 06:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 07:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acfdc8
id: 7,
  start: Sat, 01 Jan 2000 07:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 08:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acf7b0
  id: 8,
  start: Sat, 01 Jan 2000 08:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 09:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acf198
  id: 9,
  start: Sat, 01 Jan 2000 09:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 10:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acee00
  id: 10,
  start: Sat, 01 Jan 2000 10:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 11:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1aceb80
  id: 11,
  start: Sat, 01 Jan 2000 11:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 12:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1ace838
  id: 12,
  start: Sat, 01 Jan 2000 12:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 13:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1ace4c8
  id: 13,
start: Sat, 01 Jan 2000 13:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 14:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acdde8
  id: 14,
  start: Sat, 01 Jan 2000 14:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 15:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acd758
  id: 15,
  start: Sat, 01 Jan 2000 15:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 16:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acd168
  id: 16,
  start: Sat, 01 Jan 2000 16:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 17:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acce20
  id: 17,
  start: Sat, 01 Jan 2000 17:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 18:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acc678
  id: 18,
  start: Sat, 01 Jan 2000 18:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 19:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1abfb30
  id: 19,
  start: Sat, 01 Jan 2000 19:00:00 +03 +03:00,
stop: Sat, 01 Jan 2000 20:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1abf220
  id: 20,
  start: Sat, 01 Jan 2000 20:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 21:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1abea78
  id: 21,
  start: Sat, 01 Jan 2000 21:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 22:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1abe500
  id: 22,
  start: Sat, 01 Jan 2000 22:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 23:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1abdf10
  id: 23,
  start: Sat, 01 Jan 2000 23:00:00 +03 +03:00,
  stop: Sun, 02 Jan 2000 00:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1abd3f8
  id: 24,
  start: Sun, 02 Jan 2000 00:00:00 +03 +03:00,
  stop: Sun, 02 Jan 2000 01:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>]
我希望得到如下数组:

[23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 24]
但我得到的是:

[2, 1, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3]

我的想法是,这是因为三条记录(ID为1、2和24)的开始日期不同(1月2日,而其余记录的开始日期为1月1日)。我上面写的查询不是应该从时间类型记录中提取小时吗?真的是因为约会吗?IDK为什么这不起作用,基本上我不能在DB中更改任何内容。有什么提示我做错了什么吗?任何关于在不更改数据库的情况下创建的提示?

只需使用
DeliveryTimeslot.all.order(“start DESC”).map(&:id)
即可找到解决方案。它与我现有的应用程序一起工作

试试看

DeliveryTimeslot.all.order('start DESC')。按{| item | item.start.to _date}排序。映射{| item | item.id}

问题已解决

我相信答案是这个问题是由db本身的建设引起的。在postgresql文档中:() 他们说:

我们不建议使用带有时区的time类型

…而ActiveRecord不知怎么搞砸了ActiveSupport::TimeWithZone

一位同事告诉我按小时分类。 在psql中,它看起来正常:

kriseqsdb=# SELECT EXTRACT (HOUR FROM start) AS extracted_hour, * FROM delivery_timeslots ORDER BY EXTRACT (HOUR FROM start) DESC;
 extracted_hour | id |  start   |   stop   |         created_at         |         updated_at         
----------------+----+----------+----------+----------------------------+----------------------------
             23 |  2 | 23:00:00 | 00:00:00 | 2016-10-05 14:57:39.981764 | 2017-03-16 09:40:25.960571
             22 |  1 | 22:00:00 | 23:00:00 | 2016-10-05 14:57:39.960375 | 2017-03-16 09:40:25.738402
             21 | 24 | 21:00:00 | 22:00:00 | 2016-10-05 14:57:40.381005 | 2017-03-16 09:40:27.558225
             20 | 23 | 20:00:00 | 21:00:00 | 2016-10-05 14:57:40.362648 | 2017-03-16 09:40:27.485668
             19 | 22 | 19:00:00 | 20:00:00 | 2016-10-05 14:57:40.347286 | 2017-03-16 09:40:27.413084
             18 | 21 | 18:00:00 | 19:00:00 | 2016-10-05 14:57:40.329297 | 2017-03-16 09:40:27.340032
             17 | 20 | 17:00:00 | 18:00:00 | 2016-10-05 14:57:40.309307 | 2017-03-16 09:40:27.267091
             16 | 19 | 16:00:00 | 17:00:00 | 2016-10-05 14:57:40.291424 | 2017-03-16 09:40:27.194525
             15 | 18 | 15:00:00 | 16:00:00 | 2016-10-05 14:57:40.261229 | 2017-03-16 09:40:27.122137
             14 | 17 | 14:00:00 | 15:00:00 | 2016-10-05 14:57:40.244531 | 2017-03-16 09:40:27.049617
             13 | 16 | 13:00:00 | 14:00:00 | 2016-10-05 14:57:40.228901 | 2017-03-16 09:40:26.977144
             12 | 15 | 12:00:00 | 13:00:00 | 2016-10-05 14:57:40.2118   | 2017-03-16 09:40:26.904671
             11 | 14 | 11:00:00 | 12:00:00 | 2016-10-05 14:57:40.194678 | 2017-03-16 09:40:26.832177
             10 | 13 | 10:00:00 | 11:00:00 | 2016-10-05 14:57:40.175353 | 2017-03-16 09:40:26.759804
              9 | 12 | 09:00:00 | 10:00:00 | 2016-10-05 14:57:40.159382 | 2017-03-16 09:40:26.687357
              8 | 11 | 08:00:00 | 09:00:00 | 2016-10-05 14:57:40.144921 | 2017-03-16 09:40:26.614746
              7 | 10 | 07:00:00 | 08:00:00 | 2016-10-05 14:57:40.127898 | 2017-03-16 09:40:26.542091
              6 |  9 | 06:00:00 | 07:00:00 | 2016-10-05 14:57:40.106023 | 2017-03-16 09:40:26.469586
              5 |  8 | 05:00:00 | 06:00:00 | 2016-10-05 14:57:40.082284 | 2017-03-16 09:40:26.397126
              4 |  7 | 04:00:00 | 05:00:00 | 2016-10-05 14:57:40.06161  | 2017-03-16 09:40:26.324512
              3 |  6 | 03:00:00 | 04:00:00 | 2016-10-05 14:57:40.046009 | 2017-03-16 09:40:26.251731
              2 |  5 | 02:00:00 | 03:00:00 | 2016-10-05 14:57:40.03066  | 2017-03-16 09:40:26.178915
              1 |  4 | 01:00:00 | 02:00:00 | 2016-10-05 14:57:40.015266 | 2017-03-16 09:40:26.106172
              0 |  3 | 00:00:00 | 01:00:00 | 2016-10-05 14:57:39.996529 | 2017-03-16 09:40:26.033393
(24 rows)
通过rails控制台也是如此:

DeliveryTimeslot.connection.select_all("SELECT EXTRACT (HOUR FROM start) AS extracted_hour, * FROM delivery_timeslots ORDER BY EXTRACT (HOUR FROM start) DESC")
=>
[23.0, 2, "23:00:00", "00:00:00", "2016-10-05 14:57:39.981764", "2017-03-16 09:40:25.960571"],
   [22.0, 1, "22:00:00", "23:00:00", "2016-10-05 14:57:39.960375", "2017-03-16 09:40:25.738402"],
   [21.0, 24, "21:00:00", "22:00:00", "2016-10-05 14:57:40.381005", "2017-03-16 09:40:27.558225"],
   [20.0, 23, "20:00:00", "21:00:00", "2016-10-05 14:57:40.362648", "2017-03-16 09:40:27.485668"],
   [19.0, 22, "19:00:00", "20:00:00", "2016-10-05 14:57:40.347286", "2017-03-16 09:40:27.413084"],
   [18.0, 21, "18:00:00", "19:00:00", "2016-10-05 14:57:40.329297", "2017-03-16 09:40:27.340032"],
   [17.0, 20, "17:00:00", "18:00:00", "2016-10-05 14:57:40.309307", "2017-03-16 09:40:27.267091"],
   [16.0, 19, "16:00:00", "17:00:00", "2016-10-05 14:57:40.291424", "2017-03-16 09:40:27.194525"],
   [15.0, 18, "15:00:00", "16:00:00", "2016-10-05 14:57:40.261229", "2017-03-16 09:40:27.122137"],
   [14.0, 17, "14:00:00", "15:00:00", "2016-10-05 14:57:40.244531", "2017-03-16 09:40:27.049617"],
   [13.0, 16, "13:00:00", "14:00:00", "2016-10-05 14:57:40.228901", "2017-03-16 09:40:26.977144"],
   [12.0, 15, "12:00:00", "13:00:00", "2016-10-05 14:57:40.2118", "2017-03-16 09:40:26.904671"],
   [11.0, 14, "11:00:00", "12:00:00", "2016-10-05 14:57:40.194678", "2017-03-16 09:40:26.832177"],
   [10.0, 13, "10:00:00", "11:00:00", "2016-10-05 14:57:40.175353", "2017-03-16 09:40:26.759804"],
   [9.0, 12, "09:00:00", "10:00:00", "2016-10-05 14:57:40.159382", "2017-03-16 09:40:26.687357"],
   [8.0, 11, "08:00:00", "09:00:00", "2016-10-05 14:57:40.144921", "2017-03-16 09:40:26.614746"],
   [7.0, 10, "07:00:00", "08:00:00", "2016-10-05 14:57:40.127898", "2017-03-16 09:40:26.542091"],
   [6.0, 9, "06:00:00", "07:00:00", "2016-10-05 14:57:40.106023", "2017-03-16 09:40:26.469586"],
   [5.0, 8, "05:00:00", "06:00:00", "2016-10-05 14:57:40.082284", "2017-03-16 09:40:26.397126"],
   [4.0, 7, "04:00:00", "05:00:00", "2016-10-05 14:57:40.06161", "2017-03-16 09:40:26.324512"],
   [3.0, 6, "03:00:00", "04:00:00", "2016-10-05 14:57:40.046009", "2017-03-16 09:40:26.251731"],
   [2.0, 5, "02:00:00", "03:00:00", "2016-10-05 14:57:40.03066", "2017-03-16 09:40:26.178915"],
   [1.0, 4, "01:00:00", "02:00:00", "2016-10-05 14:57:40.015266", "2017-03-16 09:40:26.106172"],
   [0.0, 3, "00:00:00", "01:00:00", "2016-10-05 14:57:39.996529", "2017-03-16 09:40:26.033393"]
在这种情况下,这对我来说没关系,因为这是我最关心的问题。但为了澄清我的问题并获得合适的数组,我只在一小时内映射了它:

DeliveryTimeslot.connection.select_all("SELECT EXTRACT (HOUR FROM start) AS extracted_hour, * FROM delivery_timeslots ORDER BY EXTRACT (HOUR FROM start) DESC").rows.map { |row| row[0].to_i }
基本上我已经知道了

    => [23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

结果与我的查询“[2,1,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3]”的结果相同。这是比我的方法更快的方法:D
    => [23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]