Я работаю над проектом Rails 5.1, который потребовал индексирования и поиска записей Project
по значениям полей записи и по наличию связанной записи Category
(Project
имеет и принадлежит многим Category
).
У меня есть SearchController
с действием search
, которое содержит форму, собирающую параметры поиска. В форме у меня есть вход для параметра имени и выбор для категории. Поиск выполняется успешно, если поиск не возвращает 0 результатов, все работает нормально, если есть результаты для возврата. В тех случаях, когда не должно быть результатов, ActiveRecord выдает ошибку:
Mysql2::Error: Column 'name' in where clause is ambiguous: SELECT COUNT(*) FROM `projects` INNER JOIN `categories_projects` ON `categories_projects`.`project_id` = `projects`.`id` INNER JOIN `categories` ON `categories`.`id` = `categories_projects`.`category_id` WHERE (name LIKE '%something%') AND `categories`.`id` = 1
Есть идеи о том, что может быть причиной этого?
Модель проекта
class Project < ApplicationRecord
has_and_belongs_to_many :categories
end
Категория Модель
class Category < ApplicationRecord
has_and_belongs_to_many :projects
end
SearchController
class SearchController < ApplicationController
def search
projects = Project.all
projects = projects.where('name LIKE ?', "%#{params[:name]}%") if params[:name].present?
projects = projects.joins(:categories).where(categories: { id: params[:category_id] }) if params[:category_id].present?
@projects = projects
end
end
Маршруты
Rails.application.routes.draw do
...
get "search", to: "search#search"
...
end
View
<h1>Search</h1>
<%= form_tag(search_path, method: :get) do %>
<%= label_tag :name %>
<%= text_field_tag :name, params[:name] %>
<%= label_tag :category_id %>
<%= select_tag(:category_id, options_for_select(Category.all.collect {|o| [ o.name, o.id ] }, params[:category_id]), { prompt: 'Select Category'}) %>
<%= submit_tag "Search" %>
<% end %>
<h2><%= pluralize(@projects.count, "Result") %></h2>
<% @projects.each do |project| %>
<h3><%= project.name %></h3>
<% end %>