在ruby哈希数组中搜索

时间:2012-08-27 14:56:03

标签: ruby-on-rails ruby

我需要在我的rails应用程序中找到一些数据,首先我在rails模型中搜索所有数据,然后通过一些字段(从excel文件获取)我需要在我的数组中找到,但是找到像sql一样的%%,所以不具体,但是像sql中的%%。如何在红宝石中做到这一点?

@suppliers = Supplier.find(:all)
supplier = @suppliers.find{|item| item['SUP_BRAND']=="*"+row[13]+"*"}

我做了类似的事,但那个坏主意,是不是更好的方式?

4 个答案:

答案 0 :(得分:1)

如果我理解正确,你要做的就是部分匹配,对吗?也许使用正则表达式是正确的方法吗?试试这个:

... item['SUP_BRAND'] =~ /row[13]/ ...

这将在字符串row[13]中查找item['SUP_BRAND']中包含的文本。尝试使用Rubular来使用正则表达式。

答案 1 :(得分:1)

看起来你正在使用ActiveRecord。您应该只使用内置查询:

Supplier.where("SUP_BRAND like ?", "%#{row[13]}")

答案 2 :(得分:1)

这应该做你想要的技巧。我们与Regexp匹配,.*在开头和结尾处由%构建,与SQL中的row[13]相同,并在它们之间放置@suppliers = Supplier.find(:all) supplier = @suppliers.find{|item| item['SUP_BRAND'] =~ Regexp.new(".*#{row[13]}.*") } 值:< / p>

item['SUP_BRAND'] =~ /.*#{row[13]}.*/

<强>更新

我刚检查过“regexp”语法或者你怎么称呼它,在这种情况下也会起作用:

{{1}}

答案 3 :(得分:0)

find方法是detect方法的别名,只返回第一个项目。我假设您想要返回一组匹配项?

@suppliers = Supplier.find(:all)
supplier = @suppliers.select { |item| item['SUP_BRAND'].include?(row[13]) }

或使用正则表达式

supplier = @suppliers.select { |item| item['SUP_BRAND'] =~ /#{row[13]}/ }

但这效率很低。如果您有数百或数千个供应商怎么办?好奇为什么这不能用直接的ActiveRecord写。