1

私はRails 5.1プロジェクトに取り組んでいます.Rails 5.1プロジェクトでProjectは、レコードのフィールドの値によるレコードのインデックス作成と検索、および接続されたレコードの存在によるレコードのインデックス作成と検索が必要でしたCategory( Projecthas および members to many Category)。

検索パラメーターを収集するフォームを含むアクションがありますSearchControllersearchフォームには、name パラメータの入力とカテゴリの選択があります。検索が 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

検索コントローラー

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

意見

<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 %>
4

1 に答える 1