迭代对象(如果存在,单个或复数)

bra*_*r19 4 ruby ruby-on-rails

假设我有对象my_obj

我从数据库中得到这个对象,有了更多的计算,没关系......

然后我需要通过这样的对象迭代,如:

my_obj.each do |m|
 some_method(m.id)
end
Run Code Online (Sandbox Code Playgroud)

这段代码不好,因为如果my_obj为nil,我会得到如下错误:

undefined method `each' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

所以我决定写:

  if my_obj.present?
    my_obj.each do |m|
     some_method(m.id)
    end
  end
Run Code Online (Sandbox Code Playgroud)

但我认为还有另外一种方法可以做到这一点,如果建筑没有写到处.

那么我怎么能通过对象迭代,只有它不是null?

Bil*_*han 5

我发现代码对于普通的OOP原则有点反模式"Tell,Do not ask".我在控制台中尝试了这个问题,发现你不必担心.

无论结果是什么,空白数组或空白的ActiveRecord :: Relation对象,each都可以工作并返回一个空白数组[].

Article.count
# => 0

articles = Article.all # Return array in Rails 3
articles.each { |a| puts a.title }
# => []

articles = Article.scoped # Return ActiveRecord::Relation object in Rails 3
articles.each { |a| puts a.title }
# => []
Run Code Online (Sandbox Code Playgroud)

我建议你查看方法并返回查询结果.如果您的查询返回异常情况,请确保它至少返回一个空白数组.那你就不需要考虑太多了.


rai*_*inz 5

最简单的处理方法是使用'Array'转换函数围绕您的对象,该函数会将您可能的nil输入强制转换为数组,同时保持现有数组不变,例如

>> Array(nil)
=> []
Run Code Online (Sandbox Code Playgroud)

>> Array([1])
=> [1]
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下:

Array(my_obj).each do |m|
 some_method(m.id)
end
Run Code Online (Sandbox Code Playgroud)