Ruby搜索哈希和数组的数组



我有一系列哈希,其中还包括一个数组:

machines = [{ 'name' => 'ldapserver1', 'ip' => '10.199.0.10',
         'role' => ['server', 'initial'] },
       { 'name' => 'ldapserver2', 'ip' => '10.199.0.11',
         'role' => ['server', 'secondary'] },
       { 'name' => 'ldapclient1', 'ip' => '10.199.0.12',
         'role' => 'client' },
       { 'name' => 'ldapclient2', 'ip' => '10.199.0.13',
         'role' => 'client' }]

我想通过它搜索以匹配角色来获取机器。

我可以用它来获取具有客户角色的机器:

results = @machines.select { |machine| machine['role'] == 'client' }
[{"name"=>"ldapclient1", "ip"=>"10.199.0.12", "role"=>"client"}, {"name"=>"ldapclient2", "ip"=>"10.199.0.13", "role"=>"client"}]

但是,当我尝试搜索角色数组时,这会破裂:

results = machines.select { |machine| machine['role'] == 'server' }
[]

如何搜索角色阵列以找到我的机器的匹配项?

这是Enumerable#grep的完美用例:

machines.reject { |m| [*m['role']].grep('server').empty? }

在这里,SPLAT用于从Array实例和String实例中产生数组。

根据您的代码,角色可以是字符串或数组,因此可以安全地检查以下

results = machines.select { |machine| Array(machine['role']).include?('server') }

更新:使用数组,此方法试图通过调用to_ary来创建数组,然后在其参数上to_a。

那是因为 'role'可以是字符串或数组。

如果是字符串,则使用#include?匹配一部分。或完全匹配数组中的字符串。

尝试:

results = machines.select { |machine| machine['role'].include?('server') }

或更强大的

results = machines.select do |machine| 
  r = machine['role']
  if r.is_a? String
    r == 'server'
  else
    r.include?('server') 
  end
end

最新更新