【问题标题】:Get all Rails records from an array of IDs从 ID 数组中获取所有 Rails 记录
【发布时间】:2014-11-16 22:21:09
【问题描述】:

我有一组记录 ID ["303", "430", "4321", "5102"]。我想使用 SQL 获取与这些 ID 匹配的所有记录:

acceptable_ids = ["303", "430", "4321", "5102"]
@users = User.where("is_awesome = true AND id IN acceptable_ids)

给出这个错误:

ActiveRecord::StatementInvalid (PG::SyntaxError: ERROR:  syntax error at or near "["

编写查询以获取 ID 与 acceptable_ids 匹配的所有用户的正确方法是什么?

注意:

我知道User.find(acceptable_ids),但不能使用它,因为我正在使用 select、where 和 join 子句构建 SQL 查询。

【问题讨论】:

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


【解决方案1】:

你可以这样做。

@users = User.where("is_awesome = true AND id IN (#{acceptable_ids.join(', ')})")

我确定我已经看到了一种更简单的方法,但现在想不起来了……但上面应该可以工作。

编辑

但是,您可以从喧嚣的 cmets 中看到这不是一个受欢迎的答案,因此您应该查看一些链接和列出的替代方案,例如

# Will raise exception if any value not found
User.find( [1,3,5] )

# Will not raise an exception
User.find_all_by_id( [1,3,5] )

【讨论】:

  • 参数转换当然应该交给ActiveRecord。否则是不好的做法,因为它使 SQL 注入更有可能发生,尤其是对于初学者。
  • 我认为你有一个额外的括号,对吧?
  • 谢谢@DonnyP ...我想我错过了一个右括号,只是添加了它。
  • 这个答案太糟糕了,我不得不投反对票。请查看其他答案以了解应如何完成。你永远不应该手动连接 SQL 查询(可能的 SQL 注入),你应该使用 Rails 给你的东西,而不是重新发明轮子......
  • 你肯定会在这里接受 SQL 注入。
【解决方案2】:
User.where(is_awesome: true, id: acceptable_ids)

【讨论】:

    猜你喜欢
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 2021-03-21
    • 2015-03-20
    相关资源
    最近更新 更多