

### 解決したいこと

ransackを使ったサッカー選手検索機能を実装中です。  
キーワードでの検索は成功するのですがactiverecordの検索ができません  
フォームデータの送信はうまく行っているのですが、そこから先がわからないです。

### 発生している問題・エラー

[code]

    <%= search_form_for @q, url: search_items_path do |f| %>
    <%= f.label :name_cont, '選手検索' %>
    <%= f.search_field :name_cont %>
    <% f.label :category_id %>
    <%= f.collection_select(:category_id, Category.all, :id, :name, {}, {class:"select-box", id:"category"}) %>
    <% f.label :country_id %>
    <%= f.collection_select(:country_id, Country.all, :id, :name, {}, {class:"select-box", id:"country"}) %>
    <br>
    <%= f.submit '検索' %>
    <% end %>
    
[/code]

これが問題のコードです  
nameのみにキーワードを入れた場合

[code]

    Parameters: {"q"=>{"name_cont"=>"メッシ", "category_id"=>"0", "country_id"=>"0"}, "commit"=>"検索"}
    
[/code]

こうなって検索に成功しますが、activerecordからキーワードを入れた場合

[code]

    Parameters: {"q"=>{"name_cont"=>"", "category_id"=>"1", "country_id"=>"0"}, "commit"=>"検索"}
    
[/code]

この場合検索に失敗します  
全てのactiverecordに_contをつけた場合、nameにキーワードをれても検索に失敗します

カテゴリーのみ入れた時の検索と、文字を何も入れずに検索した時の挙動が同じです  
そのためカテゴリーidを受け取るための何かが欠けているのだと思います  
modelは  
itemが

[code]

    class Item < ApplicationRecord
    extend ActiveHash::Associations::ActiveRecordExtensions
    belongs_to :category
    belongs_to :minicategory
    belongs_to :brand
    end
    
[/code]

categoryが

[code]

    class Category < ActiveHash::Base
    include ActiveHash::Associations
    has_many :items
    
    self.data = [
    { id: 0, name: 'カテゴリー選択' },
    { id: 1, name: 'キーパー' },
    { id: 2, name: 'ストライカー' },
    ]
    end
    
[/code]

playerのカラムは

[code]

    id,name,category_id,country_id
    
[/code]

categoryとcountryはactiverecordで実装しています。

[code]

    Parameters: {"q"=>{"name_cont"=>"", "category_id"=>"1", "country_id"=>"0"}, "commit"=>"検索"}
    
[/code]

このようにparameterのnameが空で、countryまたはcategoryの数値がある場合、countryが合致しているものを表示します。name、category、countryのどれかが合致していれば表示するとしたいため、部分一致検索の実装だと思います。


CC BY-SA 4.0
2022-03-16T02:13:41.973
86846
2022-03-17T04:27:04.440
2022-03-16T06:23:52.903
2238
51839
question
ruby-on-rails ruby rubygems
ruby on railsに関して、ransackを使ったactiverecordの検索について


<https://github.com/activerecord-hackery/ransack#search-matchers> をみても `*_id`
という Predicate はないので、 `category_id` や `country_id` を完全一致で検索したいなら、パラメータは
`q[category_id]` や `q[country_id]` ではなく以下のように `q[category_id_eq]` や
`q[country_id_eq]` にする必要があるのではないでしょうか。

[code]

    <% f.label :category_id_eq %>
    <%= f.collection_select(:category_id_eq, Category.all, :id, :name, {}, {class:"select-box", id:"category"}) %>
    <% f.label :country_id_eq %>
    <%= f.collection_select(:country_id_eq, Country.all, :id, :name, {}, {class:"select-box", id:"country"}) %>
    
[/code]


CC BY-SA 4.0
2022-03-17T04:27:04.440
86864
2022-03-17T04:27:04.440
14277
86846
answer