使用WHERE筛选数据库结果

时间:2012-10-11 17:23:07

标签: ruby database search conditional-statements where

我有一个包含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 中的每个网址,因为这可以有 n ,这需要 n 查询。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

在SQL中,您可以这样说:

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

您可以使用ActiveRecord执行此操作:

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

如果您只想获得一系列匹配的网址,请说:

Link.select(:url).where(:url => ['url1', 'url2', 'url3']).map(&:url)
# SQL: SELECT url FROM links WHERE url IN ('url1', 'url2', 'url3')
# => ['url1', 'url2']

答案 1 :(得分:2)

这是简化版本,假设您使用的是activerecord和最新的rails版本。请务必使用pluck,因为它优于使用map

进行两次迭代
urls = ["url1", "url2", "url3", "url4", ... ]
urlsInDB = Link.where(:url => urls).pluck(:url)