2016-12-18 2 views
0

У меня есть функция поиска в моем приложении, где я ищу компанию, и результаты - это компании, соответствующие названию и связанным с ними первичным категориям для всех этих компаний.Использование Ransack в рельсах для поиска компаний и связанных с ними категорий

Я использую ransack для захвата соответствующих компаний.

Компании и первичные категории имеют ассоциацию has_many_and_belongs_to_many. Я рефакторинг кода, чтобы захватить соответствующие первичные категории из возвращенных компаний.

Ниже приведен метод перед внесением изменений.

def search 
    @q = Company.ransack(name_cont: params[:q][:name], keywords_name_cont: params[:q][:name], m: 'or') 
    @companies = @q.result.uniq 
    @q2 = PrimaryCategory.ransack(name_cont: params[:q][:name]) 
    @categories = @q2.result.uniq 
    @search_term = params[:q][:name] 
end 

На странице результатов поиска, то я могу получить компанию, но основные категории пустые, так как я возвращается пустой объект массива.

Я ищу чистый способ извлечения связанного primary_categories из возвращенных компаний

Я переписан вышеописанный способ, чтобы включить объект массива.

def search 
    @q = Company.ransack(name_cont: params[:q][:name], keywords_name_cont: params[:q][:name], m: 'or') 
    @companies = @q.result.uniq 
    @categories = [] 
    @search_categories = @companies.each {|co| @categories << co.primary_categories} 
    @categories.flatten!.uniq 
    @search_term = params[:q][:name] 
end 

Это работает, но я хочу знать, могу ли я получить тот же результат, используя ransack. Есть ли более эффективный способ захвата связанных объектов с помощью ransack вместо создания отдельного массива категорий?

+0

Непонятно, что вы пытаетесь получить здесь. вы пытаетесь загрузить два типа моделей в одном и том же действии поиска или пытаетесь выполнить поиск по имени или категории? –

ответ

0

Для вашего первоначального вопроса о загрузке компаний, основанных на имени и в том числе в категориях с компаниями, я бы просто использовал параметр ActiveRecord.

Company.includes(:primary_categories).ransack(...)

каждая компания загружена, то будет его primary_categories нетерпеливым загружено.

Смежные вопросы