我有一个 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
这对服务器来说将非常繁重。
有没有更好的方法?
实际上,我认为您在问题中提出的解决方案是最好的。
required_ids = given_ids - Model.where(id: given_ids).pluck(:id)
这是一个单一的简单查询,它只返回 id 列,因此数据库流量最小,然后你做数组算术。
您正在尝试查找不存在的记录(而不是不在给定数组集中的记录(,因此我看不到可能返回不存在的记录的查询。 :)
您可以搜索数组中未给出 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)
我建议你使用原始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(',')])
也许不需要加入方法。