Ruby on rails 如何从基于多个键的哈希中删除重复项?

Ruby on rails 如何从基于多个键的哈希中删除重复项?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我有一个查询,返回24小时内的所有IPS事件,并将其串在一起显示在我的视图中。我想根据[sig\u id,ips\u攻击者\u ip,ips\u目标]密钥删除重复项。基本上,如果从同一台主机到一台服务器的签名id相同,我希望剔除3000多次尝试中的1次 @events = IpsEvent.all(conditions: ['timestamp >= ?', ts]).reverse.uniq # Start IPS Event txt display @ips_events = [] @

我有一个查询,返回24小时内的所有IPS事件,并将其串在一起显示在我的视图中。我想根据[sig\u id,ips\u攻击者\u ip,ips\u目标]密钥删除重复项。基本上,如果从同一台主机到一台服务器的签名id相同,我希望剔除3000多次尝试中的1次

@events = IpsEvent.all(conditions: ['timestamp >= ?', ts]).reverse.uniq
# Start IPS Event txt display
@ips_events = []
@events.each do |events|
  ips_timestamp = events.timestamp
  ips_hostname = get_hostname(events.sid)
  sig_id = get_sig_sid(events.signature)
  sig_name = get_sig_name(events.signature)
  sig_protocol = get_event_protocol(events.sid, events.cid)

  if sig_protocol == 6
    sig_protocol = 'tcp'

  elsif sig_protocol == 17
    sig_protocol = 'udp'

  elsif sig_protocol == 1
    sig_protocol = 'icmp'

  elsif !sig_protocol
    sig_protocol = 'null'

  end

  ips_attacker_ip = get_attacker_ip(events.sid, events.cid).to_s(16).rjust(8,'0').scan(/.{2}/).map(&:hex).join('.')
  if get_event_protocol(events.sid, events.cid) == 6
    ips_attacker_port = get_tcp_sport(events.sid, events.cid)

  elsif get_event_protocol(events.sid, events.cid) == 17
    ips_attacker_port = get_udp_sport(events.sid, events.cid)

  elsif get_event_protocol(events.sid, events.cid) == 1
    'icmp'

  elsif !get_event_protocol(events.sid, events.cid)
    'null'

  end

  ips_target = get_target_ip(events.sid, events.cid).to_s(16).rjust(8,'0').scan(/.{2}/).map(&:hex).join('.')
  if get_event_protocol(events.sid, events.cid) == 6
    @ips_target_port = get_tcp_dport(events.sid, events.cid)

  elsif get_event_protocol(events.sid, events.cid) == 17
    ips_target_port = get_udp_dport(events.sid, events.cid)

  elsif get_event_protocol(events.sid, events.cid) == 1
    'icmp'

  elsif !get_event_protocol(events.sid, events.cid)
    'null'

  end

  @ips_events += [timestamp: ips_timestamp,hostname: ips_hostname,signature_id: sig_id,signature_name: sig_name,
                 protocol: sig_protocol, attacker: ips_attacker_ip,attacker_port: ips_attacker_port,
                 target: ips_target,target_port: ips_target_port]

end
# End IPS Event txt display
这是我的观点中的代码

<table>
      <tr>
        <th>Timestamp</th>
        <th>Sensor Name</th>
        <th>Signature ID</th>
        <th>Signature Name</th>
        <th>Protocol</th>
        <th>Source IP</th>
        <th>Source Port</th>
        <th>Target IP</th>
        <th>Target Port</th>    
      </tr>

      <% @ips_events.each do |event| %>
      <tr>
        <td class='timestamp'><%= event[:timestamp] %></td>
        <td class='sensor_name'><%= event[:hostname] %></td>
        <td class='sig_id'><%= event[:signature_id] %></td>
        <td class='sig_name'><%= event[:signature_name] %></td>
        <td class='sig_protocol'><%= event[:protocol] %></td>
        <td class='src_ip'><%= event[:attacker] %></td>
        <td class='src_port'><%= event[:attacker_port] %></td>
        <td class='tgt_ip'><%= event[:target] %></td>
        <td class='tgt_port'><%= event[:target_port] %></td>
      </tr>
      <% end %>

    </table>

这可能是一个好去处。给定一个数组,它需要一个块,如果返回false,它将从数组中删除

@events.reject! do |event|
  ...do your checking based on the keys here...
end

试一试:你写的是一个非常独特的Ruby。请去掉所有的then和分号,这将使您更容易获得代码帮助。删除了不规则的内容,谢谢提示。
@events.reject! do |event|
  ...do your checking based on the keys here...
end