Ruby 遍历两个对象并检查两个对象中是否存在某些内容

Ruby looping through two objects and checking if something is present in both objects

我有两个对象:网关和消息 我想检查 gateways 中每个网关的 contact_id 是否等于 messages 中每条消息中的 contact_id:如果 contact_id 相等,我想在网关对象否则继续; 我考虑过做类似的事情:

for gateway in gateways
  for message in messages
    if gateway.contact_id == message.contact_id 
      someRandomArray.push(gateway.files)
    end
  end
end

但是有没有比双 for 循环更好的方法,它看起来不对。也许有地图或 select?不管我怎么努力都弄不明白。

您可以将所有消息联系人 ID 保存在一个集合中,然后遍历网关以检查网关的联系人 ID 是否在该集合中

all_message_contact_ids = Set.new messages.map {|message| message.contact_id}
gateways.each do |gateway|
  if all_message_contact_ids.include? gateway.contact_id
    someRandomArray.push(gateway.files)
  end
end

你可以这样做:

message_contact_ids = messages.map(&:contact_id)
selected_gateways = gateways.select{ |gw| gw.contact_id.in?(message_contact_ids) }

然后你可以使用selected_gateways调用任何你喜欢的字段。