Использование Ransack в рельсах для поиска компаний и связанных категорий
У меня есть функция поиска в моем приложении, где я ищу компанию, и результаты - это компании, которые соответствуют названию и связанным с ними primary_categories для всех этих компаний.
Я использую Ransack, чтобы захватить соответствующие компании.
Компании и PrimaryCategories имеют ассоциацию 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 вместо создания отдельного массива категорий?
1 ответ
Для вашего первоначального вопроса о загрузке компаний по названию и включению категорий в компании, я бы просто использовал опцию include ActiveRecord.
Company.includes(:primary_categories).ransack(...)
тогда каждая загруженная компания будет загружать свои primary_categories.