如何毫无例外地选择 Array Rails ActiveRecord 中的 ID

当我有一系列 id 的时候,比如

ids = [2,3,5]

我表演

Comment.find(ids)

一切正常。但是如果有不存在的 id,我就会得到一个异常。这通常发生在我得到匹配某个过滤器的 ID 列表时,然后执行类似于

current_user.comments.find(ids)

这一次,我可能有一个有效的注释 ID,但不属于给定的用户,所以它没有找到,我得到了一个异常。

我试过 find(:all, ids),但它返回所有记录。

我现在唯一能做的就是

current_user.comments.select { |c| ids.include?(c.id) }

但在我看来,这是个效率极低的解决方案。

是否有更好的方法选择 数组中的 ID而不会对不存在的记录产生异常?

152997 次浏览

为了避免异常扼杀你的应用程序,你应该捕获这些异常,并按照你的意愿对待它们,在没有找到 id 的情况下为你的应用程序定义行为。

begin
current_user.comments.find(ids)
rescue
#do something in case of exception found
end

下面是关于 Ruby 中异常的 更多信息

如果只是为了避免您所担心的异常,那么“ find _ all _ by. .”函数族可以在不引发异常的情况下工作。

Comment.find_all_by_id([2, 3, 5])

即使一些 id 不存在,它也会工作

user.comments.find_all_by_id(potentially_nonexistent_ids)

还有箱子。

更新: Rails 4

Comment.where(id: [2, 3, 5])

如果您希望添加其他条件,也可以在 name _ scope 中使用它

例如,包括其他一些模式:

命名为 _ scope‘ get _ by _ ids’,lambda { | ids | { : include = > [ : comments ] ,: 條件 = > [“ comments s.id IN (?)”,ids ]}}

更新: 这个答案与 Rails4.x 更相关

这样做:

current_user.comments.where(:id=>[123,"456","Michael Jackson"])

这种方法更强大的一面是它返回一个 Relation对象,您可以将更多的 .where子句、 .limit子句等连接到该对象,这非常有帮助。它还允许不存在的 ID 而不引发异常。

较新的 Ruby 语法是:

current_user.comments.where(id: [123, "456", "Michael Jackson"])

现在. find 和. find _ by _ id 方法在 Rails4中已经被弃用了,因此我们可以使用以下方法:

Comment.where(id: [2, 3, 5])

即使一些 id 不存在,它也会工作

user.comments.where(id: avoided_ids_array)

也可以排除身份证

Comment.where.not(id: [2, 3, 5])

如果需要更多的控制(可能需要声明表名) ,还可以执行以下操作:

Model.joins(:another_model_table_name)
.where('another_model_table_name.id IN (?)', your_id_array)