如何获得表中不存在的ID? (导轨)

时间:2018-03-10 08:03:46

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

我有一系列ID

given_ids = [1,2,3,4,5,6]

我希望从表格中不存在的given_ids中获取所有ID。

我能做到:

present_ids = Model.where(id: given_ids).pluck('id') req_ids = given_ids - present_ids

但如果given_ids尺寸增加,这将在服务器上非常沉重。

有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

您可以搜索数组中未给出id的位置。

given_ids = [12,3,4,5,6]

1) req_ids = MODEL.find_by_sql("SELECT id FROM MODEL where id != all(array #{given_ids})").map{|row| row.id}

2) req_ids = MODEL.where.not(id: given_ids).pluck(:id)

答案 1 :(得分:0)

我实际上认为你在问题中提出的解决方案是最好的。

required_ids = given_ids - Model.where(id: given_ids).pluck(:id)

它是一个简单的单一查询,只返回id列,因此db流量最小,然后进行数组运算。

您正在尝试查找不存在的记录(与不在给定数组中的记录相对),因此我无法查看可能返回不存在的记录的查询。 :)

答案 2 :(得分:-1)

我建议你使用原始的sql:

Model.find_by_sql(["SELECT a.id FROM (SELECT unnest(?, ',') as id) a WHERE a.id not in (SELECT t.id FROM model_table t WHERE t.id in (?))", given_ids.join(','), given_ids.join(',')])

也许加入方法没有必要。