【问题标题】:ruby multiple where operator with jsonb column and non jsonb columns具有 jsonb 列和非 jsonb 列的 ruby​​ 多个 where 运算符
【发布时间】:2020-05-02 06:39:16
【问题描述】:

我正在尝试进行包含 jsonb 列和 2 个非 jsonb 列的查询。

多次尝试组合它们都失败了,但当我只使用 1 个其他非 jsonb 列时,1 几乎成功了。我有一个通道模型,其中包含一个“选项”商店和几个属性。

如果我将查询分开,它们就可以正常工作,但组合起来它们会检索一个空数组。我已经确保如果查询确实有效,那么肯定有数据可以返回。

非 jsonb 列 - 有效

Channel.where("platform_id = ? AND updated_at < ?",2,7.days.ago)

jsonb 列 - 有效

Channel.where("options @> ?", {valid_account: true}.to_json)

组合 where 运算符 - 返回空 []

Channel.where("platform_id = ? AND updated_at < ?",2,7.days.ago).where("options @> ?", {valid_account: true}.to_json)

1 where 运算符与组合查询 - 同样,返回空 []

Channel.where("options = ? AND platform_id = ? AND updated_at < ?", {"valid_account" => true}.to_json, 2, 7.days.ago)

我现在不知所措,不知道如何将这一切整合到一个查询中......或者是否有可能。

再次...肯定有频道应该返回上面给定的查询

TIA

更新

设法让查询工作。几乎尝试了所有组合,但错过了一个关键的组合。

Channel.where("options @> ? AND platform_id = ? AND updated_at > ?", {valid_account: true}.to_json, 2, 7.days.ago)

这行得通。出于某种原因,我在单独的方法中使用了“>@”,但没有为此组合它。现在都在工作。感谢支持

【问题讨论】:

  • 请运行此命令并分享结果:Channel.where("options = ? AND platform_id = ? AND updated_at true}.to_json, 2, 7. days.ago).to_sql
  • 第一个和第二个查询有共同的元素吗?
  • 或为Channel.where("platform_id = ? AND updated_at &lt; ?",2,7.days.ago).pluck(:id)Channel.where("options @&gt; ?", {valid_account: true}.to_json).pluck(:id) 写入结果。这将使我们能够查看是否有一些公共记录应该作为组合查询的结果返回。
  • @Fernand - "SELECT \"channels\".* FROM \"channels\" WHERE (options = '{\"valid_account\":true}' AND platform_id = 2 AND updated_at
  • 继续在下面为您的问题创建一个答案并接受它。这会让其他人知道您不需要帮助,并且会引导其他有类似问题的人找到解决方案。

标签: ruby-on-rails rails-activerecord where-clause jsonb


【解决方案1】:

答案是在 jsonb 列的查询中包含“>@”

Channel.where("options @> ? AND platform_id = ? AND updated_at > ?", {valid_account: true}.to_json, 2, 7.days.ago

【讨论】:

    猜你喜欢
    • 2022-08-15
    • 1970-01-01
    • 2020-01-22
    • 2016-11-25
    • 2016-10-25
    • 1970-01-01
    • 2017-02-05
    • 2017-08-21
    • 2017-08-23
    相关资源
    最近更新 更多