【问题标题】:Rails/PostgreSQL : query value inside an integer array columnRails / PostgreSQL:整数数组列内的查询值
【发布时间】:2015-09-20 09:58:41
【问题描述】:

我或这个查询有什么问题?

我有一个 Shop 模型,其中包含一个开放天数列,它是一个整数数组(您可以使用 Postgres 执行此操作):

days= [1,1,1,1,0,0,0]

当我查询时:

shops = Shop.where('days[0] = 1')

我得到一个空的 ActiveRecord 关系。

=> #<ActiveRecord::Relation []>

当我用这种阵列去商店时……

shop = Shop.first
=> #<Shop id: 215, days: [1, 1, 1, 1, 0, 0, 0],…

如果我这样做

shop.days[0]

我明白了

=> 1

我真的不明白。

【问题讨论】:

  • PG中的days列是怎么定义的?
  • 像这样:t.integer :days, array: true, default: [1,1,1,1,1,1,1]
  • 这就是它在我的数据库列中的“外观”:{1,1,1,1,1,1,1}。并且标题列是天整数[]
  • Rails 创建和执行的真正查询是什么?检查控制台中的输出,并在 PG 控制台上尝试。有用吗?
  • 查询是:SELECT "shops".* FROM "shops" WHERE (days[0] = 1),答案是=&gt; #&lt;ActiveRecord::Relation []&gt;。我不知道如何使用 PG 控制台,所以我要检查一下;)

标签: ruby-on-rails arrays postgresql


【解决方案1】:

默认情况下 PostgreSQL 对数组使用从一开始的编号约定,即一个有 n 个元素的数组以array[1] 开头,以array[n] 结尾。

——Source

这只是你的例子。您的索引超出范围,因此它不匹配任何记录,days[0]NULL。到处。启动rails db 和图:

SELECT * FROM shops WHERE days[0] IS NULL;

但是那个“默认”是怎么回事?是否可以在架构级别定义数组边界,这样就不会成为问题?

嗯……恐怕是 Rails 的错。如果它甚至被认为是一个“问题”。为了使数组零索引,它应该在 SQL 中保存。我在 SQL 中尝试过,它可以工作:

INSERT INTO shops
        (days,           created_at,        updated_at)
  values('[0:2]={1, 1, 0}', current_timestamp, current_timestamp);

不幸的是,Rails 出于某种原因失去了界限:

 Shop.create(days: '[0:3]={6, 7, 8, 9}')
 > INSERT ... [["days", "{6,7,8,9}"], ...]

【讨论】:

  • 啊,这就解释了为什么昨天没有发生这种情况^^。 Time.zone.now.wday = 0 今天!!!
  • 我正在研究是否可以将下限设置为 0,因为这与 Rails 开发人员使用的大多数其他工具不一致。
  • 谢谢你,因为我的代码在一天之内就大错特错了。如果我有足够的声望,我会给予你我欠你的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 2020-04-11
相关资源
最近更新 更多