ActiveRecord присоединяется к метанию столбца, в котором предложение является неоднозначной ошибкой - Rails 5.1 - PullRequest
0 голосов
/ 01 мая 2018

Я работаю над проектом 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 %>

1 Ответ

0 голосов
/ 01 мая 2018

Когда вы объединяете две таблицы, и у обеих таблиц есть столбец name, вы должны указать базе данных, какой столбец name вы хотите сопоставить.

  def search
    @projects = Project.all
    @projects = @projects.where('projects.name LIKE ?', "%#{params[:name]}%") if params[:name].present?
    @projects = @projects.joins(:categories).where(categories: { id: params[:category_id] }) if params[:category_id].present?
  end

Обратите внимание на projects.name в запросе LIKE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...