15

私はこれについて頭を悩ませてきましたが、それを得ることができません。答えはおそらく明白だと思います。

私がやろうとしていることは次のとおりです。

Ransackを使用して検索できる一連のジョブを一覧表示するインデックスコントローラーがあります。各ジョブには、日付が含まれているかnull(未完了)のいずれかの完了日があります。現在、検索自体はうまく機能しています。インデックスページに未完成の作品だけが表示されるようにしたいのですが、誰かが検索を実行したときに、完成した作品と未完成の作品の両方の結果が返されるようにもしたいと思います。

どんな助けでも大歓迎です。以下のコードで:actualは、は完了日を含むフィールドの名前です。また、Webを見回していDEFAULT_SEARCH_PARAMETER={}て、Jobモデルにあるようなものが機能するかもしれないと思ったのですが、うまくいかなかったようです。コードは次のとおりです。

class Job < ActiveRecord::Base
  DEFAULT_SEARCH_PARAMETER ={}
  attr_accessible :items_attributes, :actual
end

def index
   @search = Job.search(params[:q] || Job::DEFAULT_SEARCH_PARAMETER)
   @search.build_condition
   @results = @search.result
   @job = @results.paginate(:per_page => 10, :page => params[:page])
end
4

4 に答える 4

35

パーティーに遅れましたが、他の誰かがこれに遭遇した場合に備えて、別のアプローチを提案したいと思いました。

The answer above works, but its disadvantage is that the default is not added to Ransack's search object, so - if you are using a search form - the default selection is not shown in the form.

The following approach adds the default to the search object and therefore will appear in your search form.

def index
  @search = Job.search(params[:q])
  @search.status_cont = 'Open' unless params[:q] #or whatever, must use Ransack's predicates here
  @results = @search.result
  @job = @results.paginate(:per_page => 10, :page => params[:page])
end
于 2013-11-18T17:15:43.927 に答える
20

検索パラメーターが存在しない場合は、独自のフィルターを適用できると思います。

def index
  @search = Job.search(params[:q])
  @results = @search.result
  @results = @results.where(:your_date => nil) unless params[:q]
  @job = @results.paginate(:per_page => 10, :page => params[:page])
end
于 2012-11-08T19:14:16.913 に答える
1

Many years later I found myself with this exact problem so I thought I'd chime in with a solution I'm using. Set default search params in the controller and reverse merge them into params[:q]:

def index
  default_search_params = {
    status_cont: "open"
  }

  @search = Job.search((params[:q] || {}).reverse_merge(default_search_params))
  ...
end
于 2021-06-25T00:42:20.023 に答える
0

したがって、デフォルトでは、実際がnilであるレコードをページにロードする必要があります。そして後でユーザーが検索したときに、以前の検索の動作に戻りたいと思います。

これを試してみてください。

def index
   @search = Job.search(params[:q] || Job::DEFAULT_SEARCH_PARAMETER)
   @search.build_condition
   @results = @search.result
   if @results.nil?
        @results=Job.find(:all, :conditions => ["actual = NULL"] )
   end

   @job = @results.paginate(:per_page => 10, :page => params[:page])
end    
于 2012-11-08T18:57:00.913 に答える