Установка параметра поиска по умолчанию на Ransack для рельсов

Я ломаю голову над этим, но не могу понять. Я чувствую, что ответ, вероятно, очевиден.

Я пытаюсь сделать следующее:

У меня есть контроллер индекса, в котором перечислены серии заданий, которые я могу искать с помощью Ransack. Каждое задание имеет дату завершения, которая либо содержит дату, либо является нулевой (незавершенной). В настоящее время сам поиск работает отлично. Я хотел бы сделать так, чтобы страница индекса загружалась, показывая только незавершенную работу, но я также хочу, чтобы она работала так, чтобы, когда кто-то запускает поиск, возвращались результаты как для завершенной, так и для незавершенной работы.

Любая помощь будет принята с благодарностью. В приведенном ниже коде :actual — это имя поля с датой завершения. Я также искал в Интернете и подумал, что, возможно, что-то вроде 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

person Alexander Moore    schedule 08.11.2012    source источник


Ответы (4)


Я думаю, вы могли бы просто применить свой собственный фильтр, когда параметры поиска не существуют:

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
person lest    schedule 08.11.2012
comment
Спасибо! Это сработало. Я бы проголосовал за это, но у меня нет репутации. - person Alexander Moore; 09.11.2012
comment
Проверьте лучший ответ ricsrock, прежде чем следовать этому. - person joshua.paling; 19.06.2017

Поздно на вечеринку, но подумал, что предлагаю альтернативный подход на случай, если кто-то еще столкнется с этим.

Приведенный выше ответ работает, но его недостатком является то, что значение по умолчанию не добавляется к объекту поиска Ransack, поэтому, если вы используете форму поиска, выбор по умолчанию не отображается в форме.

Следующий подход добавляет значение по умолчанию к объекту поиска и, следовательно, будет отображаться в вашей форме поиска.

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
person ricsrock    schedule 18.11.2013
comment
Привет, @ricsrock, есть идеи, как это сделать с областью действия из белого списка? - person bnussey; 17.02.2015
comment
Хороший ответ @ricsrock. Поскольку изменяет поиск Ransack, легко добиться того, чтобы добавленное вами значение по умолчанию правильно отображалось в разделе поиска отображаемой страницы. - person Steven Chanin; 16.10.2015
comment
Очень хороший! Он отлично работает, в том числе с соответствующими значениями по умолчанию в форме поиска (как уже указал Стивен). - person Joshua Muheim; 08.08.2019
comment
Второй раз наткнулся на ваш ответ. Все еще здорово. Это должен быть правильный ответ! @alexander-moore, пожалуйста, отметьте этот ответ как правильный! - person fydelio; 05.08.2020

Таким образом, по умолчанию вы хотите, чтобы страница загружалась с записями, где фактическое значение равно нулю. А позже, когда пользователь выполнит поиск, вы захотите вернуться к тому, как ваш поиск работал раньше.

Попробуйте это.

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    
person Wasi    schedule 08.11.2012
comment
Я попробовал это, но это не сработало. Спасибо за помощь! - person Alexander Moore; 09.11.2012

Много лет спустя я столкнулся именно с этой проблемой, поэтому я подумал, что могу присоединиться к решению, которое я использую. Установите параметры поиска по умолчанию в контроллере и выполните обратное слияние их в params[:q]:

def index
  default_search_params = {
    status_cont: "open"
  }

  @search = Job.search((params[:q] || {}).reverse_merge(default_search_params))
  ...
end
person Adam    schedule 25.06.2021