如何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]}}