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?
我发现代码对于普通的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)
我建议你查看方法并返回查询结果.如果您的查询返回异常情况,请确保它至少返回一个空白数组.那你就不需要考虑太多了.
最简单的处理方法是使用'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)