AR中的SQL搜索元素是否不在列数组中

时间:2017-04-04 17:20:10

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

date = Date.today

Subscription.joins(:cart).where("'#{date.beginning_of_week(:sunday).to_s}' != ANY (carts.skipped_weeks)")

购物车上的skipped_weeks列是一个日期数组,如[“2017-04-10”,“2017-04-17”]

我正在运行上面的查询并仍然接收和记录了cart.skipped_weeks列数组中包含的日期,我只想要在skipped_weeks数组中不包含该日期的记录。

2 个答案:

答案 0 :(得分:1)

Subscription.joins(:cart).where("NOT '#{date.beginning_of_week(:sunday).to_s}' = ANY (carts.skipped_weeks)")

这是正确的表格

答案 1 :(得分:1)

PostgreSQL支持all以及any

  

<强> 9.23.4。 ALL(数组)

expression operator ALL (array expression)
     

右侧是带括号的表达式,它必须产生一个数组值。使用给定的operator计算左侧表达式并将其与数组的每个元素进行比较,这必须产生布尔结果。如果所有比较都为真,则ALL的结果为“true”(包括数组中零元素的情况)。如果发现任何错误结果,结果为“假”。

话说:

where('? != all(carts.skilled_weeks)', date.beginning_of_week(:sunday))

可能会更符合您的预期逻辑。