【问题标题】:How to get ids which doesn't exists in table? (rails)如何获取表中不存在的ID? (导轨)
【发布时间】:2018-03-10 08:03:45
【问题描述】:

我有一个 id 数组

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

我想从 given_ids 中获取 Table 中不存在的所有 id。

我能做到:

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

但是如果given_ids 的大小增加,这将对服务器造成很大负担。

有更好的方法吗?

【问题讨论】:

  • 不太一样。你没看懂问题吗?帖子中建议的答案给出了不在given_ids 中的所有其他记录。但我只需要given_ids 中不存在的ID。
  • 另外,您能否删除在我的问题上方显示给我的可能重复的标记?

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,这是有道理的。感谢您提供适当的答案。
【解决方案2】:

您可以搜索数组中没有给出 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)

【讨论】:

    【解决方案3】:

    我会建议你像这样使用原始 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(',')])
    

    也许加入方法不是必需的。

    【讨论】:

    • 投反对票时,请离开cmets
    • 此解决方案运行良好。但我不知道这个提问者有能力理解这一点。
    猜你喜欢
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多