如何select数组中的ID Rails ActiveRecord毫无例外

当我有一些IDS,如

ids = [2,3,5] 

我执行

 Comment.find(ids) 

一切正常。 但是,当有不存在的id,我得到一个exception。 当我得到匹配某个filter的ID列表,并且比我做类似的事情时,通常会发生这种情况

 current_user.comments.find(ids) 

这一次我可能有一个有效的评论ID,但不属于给定的用户,所以没有find,我得到一个exception。

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

我现在唯一能做的就是

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

但在我看来,就像超级低效的解决scheme。

有没有更好的方法来select在数组中的ID,而不是在不存在的loggingexception?

如果它只是避免了你所担心的exception,那么函数“find_all_by”就可以工作而不会抛出exception。

 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]) 

更新:这个答案是更相关的Rails 4.x

做这个:

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

这种方法的强大之处在于它返回一个Relation对象,你可以在其中join更多的.limit子句, .limit子句等,这是非常有用的。 它也允许不存在的ID而不抛出exception。

较新的Ruby语法是:

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

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

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

现在.find和.find_by_id方法在rails 4中被弃用。所以我们可以使用下面的方法:

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

即使某些ID不存在,它也可以工作。 这在工作

 user.comments.where(id: avoided_ids_array) 

也用于排除ID的

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

为了避免例外情况导致您的应用程序死机,您应该捕获这些例外情况并按照您的意愿对待它们,在未findid的情况下为您定义应用程序的行为。

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

这里有更多的rubyexception信息 。

你也可以在named_scope中使用它,如果你想放在其他条件

例如包括一些其他的模型:

named_scope'get_by_ids',lambda {| ids | {:include => [:comments],:conditions => [“comments.id IN(?)”,ids]}}