Логика контроллера для нескольких фильтров

#ruby-on-rails

#ruby-on-rails

Вопрос:

В моей модели определены следующие методы tutor.rb

 def self.fees_search(n)
    @profile = Profile.fees_to(n)
    if @profile.empty?
      return Tutor.none
    else
      @profile.map do |y|
        y.tutor
      end
    end
  end

  def self.subject_search(s)
    @subject = Subject.find_by_name(s)
    unless @subject.nil?
      @subject.tutors 
    end
  end
  

И в моем tutors_controller.rb случае у меня есть следующее для

 def index
    @tutor = Tutor.all
    @tutor = @tutor.fees_search(params[:fees_search]) if params[:fees_search].present?
    @tutor = @tutor.subject_search(params[:subject_search]) if params[:subject_search].present?
  end
  

Оба поиска работают при независимом применении, но когда я пытаюсь выполнить оба, я получаю сообщение об ошибке undefined method subject_search’ for # now i suppose its because the first method of fees_search` будет обработан первым? Вот почему я думаю, что получаю эту ошибку. Как мне тогда по-другому закодировать действие моего контроллера? Чтобы принять оба фильтра?

Очень ценю все советы. Спасибо!

Ответ №1:

Попробуйте указать, какие параметры present ,

 def index
    @tutor = Tutor.all

    @tutor_array = []

    @tutor_array << @tutor.fees_search(params[:fees_search]) if (params[:fees_search].present?

    @tutor_array << @tutor.subject_search(params[:subject_search]) if (params[:subject_search].present?

    @tutor_array << @tutor.location_search(params[:location_search]) if (params[:location_search].present?

   @tutor_array.each do |tutor| 
     ids = @tutor.merge(tutor).map(amp;:id) 
     @tutor = Tutor.where(id: ids) 
   end

end 
  

Вот ссылка

Комментарии:

1. Я попробую это, но что, если бы у меня был 3-й или даже 4-й параметр поиска? Скажите, сделал ли я @tutor = @tutor.location_search и т. Д. Как мне еще больше расширить эту логику? Потому что, если бы было 3 фильтра, а не 2, я мог бы применить либо 2, либо 3 фильтра одновременно, и это похоже на то, что это приведет к раздуванию кода из-за увеличения комбинации?

2. таким же образом вы будете отправлять параметры? будете ли вы вызывать метод на основе параметров?, когда вам нужно применить несколько фильтров?

3. мне очень жаль, но я не совсем понимаю, что вы имеете в виду… как вы думаете, вы могли бы уточнить?

4. когда вам точно нужно применить несколько фильтров?

5. Точно не указано, когда. Это происходит от пользовательского ввода через форму. Вот почему иногда может быть применен только 1 фильтр, иногда может быть применено 3 или 4 фильтра. Прямо сейчас я застрял на том, чтобы заставить 2 работать одновременно