我有一系列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
尺寸增加,这将在服务器上非常沉重。
有更好的方法吗?
答案 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(',')])
也许加入方法没有必要。