2

我有一个包含 URL 路径的数组,我希望能够在我的数据库中的一个表中搜索数组中指定的 URL 的字段之一(标记为“URL”)。

所以我有一个我想要实现的简化版本。

urls = ["url1", "url2", "url3", "url4", ... ]
urlsInDB = []
results = Link.all
urls.each() do |url|
 if not results.where(:url=>url).blank?
   urlsInDB << url
 end
end

但是我知道您不能对“.all”获得的一组结果调用“.where”。我想这样做,以便数据库只查询一次,而不是针对urls中的每个 URL,因为它可以有长度n并且需要n 个查询。

有任何想法吗?

4

2 回答 2

2

在 SQL 中,您可以这样说:

SELECT * FROM links WHERE url IN ('url1', 'url2', 'url3');

您可以通过以下方式使用 ActiveRecord 执行此操作:

Link.where(:url => ['url1', 'url2', 'url3'])

如果您只想获取匹配的 URL 数组,请说:

Link.select(:url).where(:url => ['url1', 'url2', 'url3']).map(&:url)
# SQL: SELECT url FROM links WHERE url IN ('url1', 'url2', 'url3')
# => ['url1', 'url2']
于 2012-10-11T17:26:10.287 回答
2

这是简化版本,假设您使用的是 activerecord 并且在最新的 rails 版本上。确保使用pluck,因为它比使用迭代两次更好map

urls = ["url1", "url2", "url3", "url4", ... ]
urlsInDB = Link.where(:url => urls).pluck(:url)
于 2012-10-11T17:26:54.403 回答