2015-10-01 34 views
0

什么是迭代对象数组的最简单方法,检查对象属性的字符串是否包含一个单词,然后保持匹配的结果?使用条件字符串迭代对象数组

我想这会工作:

@events = @events.map {|n| n if n.game.to_s.include?(game.to_s)}.compact 

,但我得到:

NoMethodError: undefined method `map' for nil:NilClass 

n.game既可以等于nil或者像 “宠物小精灵,MarioKart” 的字符串。

+2

这意味着'@事件'是零。另外,请查看http://apidock.com/ruby/Array/keep_if –

+1

使用'Array#select'。 –

+0

更好的是,为什么不直接使用查询方法并将工作加载到SQL中,那么'@事件'不需要加载所有东西以便稍后移除对象。如果您发布最初设置“@ events”的代码,这不应该是一件困难的任务。 – engineersmnky

回答

0

你想要#select,它也被称为#find_all。那你想要做什么,不需要做一个地图,然后紧凑,只需使用find_all

matching_events = @events.find_all {|e| n.game.to_s.include?(game.to_s) } 

http://ruby-doc.org/core-2.2.3/Enumerable.html#method-i-find_all

但是,如果你要undefined method map for nil:NilClass,这意味着你没有一个对象在你的@events变量中。如果你真的有一个数组在@events中过滤,你的代码也可以工作。您必须将其设置为您要过滤的数组,然后才能对其进行过滤。