2013-08-13 4 views
-1

Я использую Solr для поиска списка компаний. когда я пытаюсь фильтроватьРазница в рубинах между операторами

Работы

companies = [] 
    current_user.cached_company.cached_companies.each do |company| 
    companies << company.id 
    end 

не работает

companies = [] 
    companies << current_user.cached_company.cached_companies.map(&:id) 

Когда я называю

@search = Company.search do 
    with :id, companies 
    end 
    @companies = @search 

Он работает в первом примере, но не второй.

Однако это прекрасно работает

@search = Company.search do 
    with :id, current_user.cached_company.cached_companies.map(&:id) 
    end 
    @companies = @search 

Я знаю, что я что-то просто не хватает здесь. Я знаю, что это не связано с кешированием, но я не могу окунуться в то, что происходит.

+0

Когда я имею в виду, что это не сработает, я имею в виду, что Solr Search возвращает ошибку (id не является полем с несколькими значениями). – kobaltz

ответ

1

Ваш второй пример - размещение вложенного массива в companies. Вот упрощенная идея о том, что происходит:

data = [{value: 1}, {value: 2}, {value: 3}] 

foo = [] 
data.each do |number| 
    foo << number[:value] 
end 
p foo 
# => [1,2,3] # One array with 3 values 

foo = [] 
foo << data.map { |item| item[:value] } 
p foo 
# => [[1,2,3]] # One array with one value (another array with 3 values) 

Либо придерживаться вашей первой версии, или просто сделать это:

companies = current_user.cached_company.cached_companies.map(&:id) 

Или, если вы хотите придерживаться вашей 2-й вариант, убедитесь, выровняйте значения перед их использованием:

companies.flatten! 
+0

Спасибо Дилан. Это работает. Я не понимал, что это так. Любые мысли о производительности, относительно которых можно было бы повысить эффективность? – kobaltz