2012-10-11 71 views
2

我有一個包含URL路徑的數組,我希望能夠在表中搜索數據庫中的數組中指定的URL的其中一個字段(標記爲「URL」)。使用數據庫篩選結果使用WHERE

所以我有我想要實現的簡化版本。

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

不過,我知道,你可以不叫「凡」上一組「所有」得到的結果。我想這樣做,這種方式使數據庫永遠只能查詢一次不是針對每個URL在網址,因爲這可以有長度ñ這將需要ň查詢。

任何想法?

回答

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'] 
+0

這將與新的Rails'pluck'方法得到更好的服務更好。加載整個模型並提取單個值的效率極低。 – tadman

+0

爲什麼這個答案會被接受,而更有效的和最新的提供? – weexpectedTHIS

2

這是假設你使用activerecord和最新的rails版本的簡化版本。確保使用pluck,因爲它比兩次迭代使用map

urls = ["url1", "url2", "url3", "url4", ... ] 
urlsInDB = Link.where(:url => urls).pluck(:url)