

今、ruby on
railsで複合条件の検索を実装をしています。二つのカラムの項目があって、そのカラムに一致するレコードを表示されるようにしようとしています。viewとmodelを変えたのですが、まだ二つが重なる条件が出てきません。どうぞ教えていただけたら、嬉しいです。

[![画像の説明をここに入力](https://i.stack.imgur.com/uwnrA.png)](https://i.stack.imgur.com/uwnrA.png)

[code]

    Controller 
    
    def index
      @plans = Plan.includes(:guider).page(params[:page]).per(5).order("created_at DESC")
      @plans = Plan.page(params[:page]).per(5).order("created_at DESC").search(params[:search])
    end
[/code]

[code]

    Model
    
    def self.search(search) 
          if search 
            Plan.where("(datetimes like ?) AND (title like ?)", "%#{params[:search1]}%", "%#{params[:search2]}%")
          else
            Plan.all
          end
    end
[/code]

[code]

    <div class="david">
       <%= form_tag plans_path, :method => 'get', :class => 'david' do %>
        <p><strong>Place: </strong></p>
        <div style="width: 250px;" placeholder="date" >
          <p><%= text_field_tag :datetimes, params[:search1] %></p>
          <p><%= text_field_tag :title, params[:search2] %></p>
          <%= submit_tag "Search", :name => nil %>
        </div>
       <% end %>
    </div>
[/code]


CC BY-SA 4.0
2019-01-11T13:03:22.240
51898
2019-01-12T00:25:32.167
30829
question
ruby-on-rails ruby html
複合条件での検索結果が出てこない状態になってます。


>
[code]

>     def self.search(search)
>           if search
>             Plan.where("(datetimes like ?) AND (title like ?)",
> "%#{params[:search1]}%", "%#{params[:search2]}%")
>  
[/code]

モデルの中では`params`は参照できません。素直に書き換えるのであれば

[code]

    def self.search(search1, search2) 
      if search1 && search2 
        Plan.where("(datetimes like ?) AND (title like ?)", "%#{search1}%", "%#{search2}%")
    
[/code]

として、呼び出す側も引数を2つ渡すように書き換えてください。


CC BY-SA 4.0
2019-01-11T13:30:55.787
51900
2019-01-11T13:30:55.787
5793
51898
answer


# clientからserverへ値の渡し方

@suzukis さんの回答の通りmodelでは`params`をそのまま用いることはできません。

また、viewで

`<%= text_field_tag :datetimes, params[:search1] %>`

とすると、`params[:search1]`が`nil`であった場合生成されるhtmlは

`<input type="text" name="datetimes" id="datetimes">`

となります。

`params[:search1]`や`params[:search2]`のように`:datetimes`ではないkeyを用いて`params`を呼び出しているので、clientから送られてきたパラメータを適切に扱えてないように思えます。

# controllerで`@plans`の複数定義

[code]

    def index
      @plans = Plan.includes(:guider).page(params[:page]).per(5).order("created_at DESC")
      @plans = Plan.page(params[:page]).per(5).order("created_at DESC").search(params[:search])
    end
    
[/code]

とありますが、２回目の`@plans = ...`で１回目の`@plans`を上書きしているので、冗長化と思われます。

# その他

どのようなスキーマなのかわからないので、ただしいクエリが発行されいているかどうかは現状なんとも言えません。

それを確認するにはリクエスト・レスポンス時の`rails
server`でどのようなSQLが発行されているのかを見ることと、controllerでの`@plans`をdumpして適切なデータを取得できているかを見ることをお勧めします。


CC BY-SA 4.0
2019-01-12T00:25:32.167
51902
2019-01-12T00:25:32.167
31669
51898
answer