Использование 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.

Другие вопросы по тегам