2016-10-06 10 views
0

私は私の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

は、

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(&:id) 
    @tutor = Tutor.where(id: ids) 
    end 

end 

Here is the reference

+0

をのparamsはpresent何であるかのcondtionsを与えて試してみてください、私はそれを試してみるだろうが、私は第三、あるいは第四の検索パラメータを持っていたものか?私が '@tutor = @ tutor.location_search'などと言った場合、どうすればそのロジックをさらに拡張できますか? 2つではなく3つのフィルタを同時に適用することができるので、組み合わせの増加によりコードが膨らむようです – angkiki

+0

は、あなたがパラメータを送信するのと同じ方法ですか?複数のフィルタを適用する必要がある場合は、パラメータに基づいてメソッドを呼び出しますか? – Sravan

+0

本当に申し訳ありませんが、私はあなたが何を意味しているのかよく理解していません...あなたは精巧にできると思いますか? – angkiki

関連する問題