Ruby - 检查是否存在交叉

时间:2012-05-04 06:52:26

标签: ruby ruby-on-rails-3 search optimization

我正在尝试使用Postgres DB在RoR应用程序中加速搜索功能。我现在不会解释它是如何工作的......只需采用/ achieve方法!

我有x个记录(可能是一个很大的数字),每个记录都有一个相关的Facebook ID号数组......可能高达5k。我需要使用个人的朋友ID列表进行搜索,以确定搜索数组与任何(以及哪些)记录数组之间是否存在交叉。

我不需要知道交集的结果,只是它是真还是假。

有什么好主意吗?!

谢谢!

2 个答案:

答案 0 :(得分:3)

由于您未提及数据存储区,因此只使用纯红宝石:

friend_ids = user.friend_ids
results = records.select { |record| !(record.friend_ids & friend_ids).empty? }

results将包含至少共有1个friend_id的所有记录。如果您必须检查大量记录,这将不会非常快。

&是数组交集运算符,用C实现,你可以在这里看到它:http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-26

答案 1 :(得分:1)

@ ctcherry答案可能更快的版本,特别是当user.friend_ids具有高基数时:

require 'set'
user_friend_ids = Set[ user.friend_ids ]
results = records.select { |record|
  record.friend_ids.any? { |friend_id| user_friend_ids.include? friend_id }
}

由于这只为user.freind_ids构造一次测试集(哈希),它可能也比@Tass链接的Array#memory_efficient_intersect更快。

这也可能在数据库中执行得更快,但如果没有关于模型的更多信息,则很难编写方法。