【问题标题】:Rails ActiveRecord find array of ids, but some are not foundRails ActiveRecord 查找 id 数组,但有些没有找到
【发布时间】:2020-08-03 07:21:03
【问题描述】:

我正在尝试通过这样的 id 数组查找模型:

Model.find [1,2,3]

但是假设这些模型中只有两个存在(id 为 2 的模型已被删除):

#<Model id: 1>
#<Model id: 3>

我收到这样的错误:

#<ActiveRecord::RecordNotFound: Couldn't find all Models with 'id': (1, 2, 3) (found 2 results, but was looking for 3).>

是否可以捕获此错误并确定哪些模型不存在?

说我在我的控制器中:

def index
  @models = Model.find params.require(:model_ids)
rescue ActiveRecord::RecordNotFound => e
  e.full_message
  ???
end

我想在 ??? 行中运行一些异常 e 的代码,这将返回 2,让我知道哪些模型没有找到,所以我可以重新运行在没有它的情况下进行查询,同时注意哪些没有找到。

【问题讨论】:

  • 如果具有给定 id 的记录不存在,是否必须进行救援?难道你不能使用where,然后通过将生成的 id 与给定的 id 进行比较来检查差异吗?
  • 对控制流使用异常通常不是一个好主意
  • @SebastianPalma 如果这是不可能的,那是我的计划。我只是好奇是不是因为它似乎在跟踪的错误中的某个地方,我只是无法弄清楚在哪里。
  • 我认为这会非常方便,但是对于 ActiveRecord 来说有点太多了,并且不建议考虑控制流的异常并且/或者成本高昂,至少在 Ruby 中是这样。
  • 我鼓励您为您的问题添加答案,因为它涉及对问题的常见疑问。我不明白为什么要关闭它。

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


【解决方案1】:

错误的方法。当您希望代码引发ActiveRecord::RecordNotFound 时,应使用.find 查找特定记录。这样做是为了确保记录存在并避免零错误。通常这用于触发 404 响应,而无需重复相同的样板:

def show
  @record = Record.find_by(id: params[:id])
  unless @record
    render file: 'public/404.html', status: :not_found
  end
end

如果您不希望代码引发,请使用 .find_by(id: id)

要获取多条记录,请使用 where:

models = Model.where(id: [1,2,3])

如果您想确定哪些 id 不存在,请使用数组 diff:

bad_ids = [1,2,3] - models.ids

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多