2012-10-11 5 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 

Однако я знаю, что вы не можете назвать «.где» на множестве результатов, полученных с помощью «.all». Я хочу сделать это таким образом, чтобы база данных только когда запрашивается один раз не для каждого URL в URLS как это может иметь длину п и что потребует п запросов.

Любые идеи?

ответ

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 и последнюю версию рельсов , Убедитесь в том, чтобы использовать pluck, так как это лучше, чем итерация дважды с использованием map

urls = ["url1", "url2", "url3", "url4", ... ] 
urlsInDB = Link.where(:url => urls).pluck(:url) 
Смежные вопросы