【问题标题】:ActiveRecord: Find where column is nil or empty arrayActiveRecord:查找列为零或空数组的位置
【发布时间】:2018-11-18 01:56:42
【问题描述】:

我在 postgres 中有一个数组列,我想查找该列为 nil[] 的所有记录。我可以搜索一个或另一个很好,但尝试都失败了。

这就是我的尝试

Model.where(column: [nil, []])

但我得到了错误

ActiveRecord::StatementInvalid (PG::InvalidTextRepresentation: ERROR:  malformed array literal: "{NULL,{}}")
DETAIL:  Unexpected "{" character.

【问题讨论】:

  • 您使用的是哪个版本的 Rails?
  • postgres 中的空数组列用'{}' 选择。也就是说:Model.where(column: [nil, "'{}'"]).
  • @mudasobwa 我认为这不会有帮助,这只会导致{NULL, '{}'} 出现不同的问题,不是吗?
  • @muistooshort 啊,确实;我评论的要点是关于如何在 postgres 中选择空数组的提示;我从不相信 AR 可以构建查询,因为在复杂查询中出现了太多的魔法和意外失败。

标签: ruby-on-rails ruby postgresql activerecord ruby-on-rails-5


【解决方案1】:

这对我有用

Model.where('column IS NULL OR column = ?', '{}')

【讨论】:

  • 对。根本问题是where(column: [nil, a]) 通常表示column is null or column = a,但是由于column 是一个数组并且ActiveRecord 知道它,它会尝试说column = '{some confused nonsense}'。你也可以看看array_length(coalesce(column, array[])) is null
  • 干得好@Qwertie。如果你不介意我问你用数组列做什么?
  • @DaryllSantos 这可能不是最好的解决方案,但是当我有可以标记的记录时,我使用 int 数组作为标签 ID,因为创建一个新表来保存标签 ID 似乎有点多和可标记的 ID。真的我应该使列非空并将默认设置为 []
【解决方案2】:
Model.where("column = ? OR column = ?", nil, [])

这将执行 SQL 查询

SELECT "models".* FROM "models" WHERE (column = NULL OR column = NULL)

但你需要这样做才能做到这一点

Model.where("column = ?", nil)

【讨论】:

  • 你检查过这个吗?我怀疑即使"column = ?", nil 也能正常工作。
  • 似乎不起作用。当我看到有一些带有 nil 和 [] 时,不显示任何结果。
猜你喜欢
  • 2014-12-11
  • 2015-12-11
  • 2018-09-19
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多