0

国、都市、場所、性別、年齢、生年月日などに基づいて、ユーザーが他のタスクを検索できる検索フォームを作成したいと思います。これが私の検索フォームです...

  <%= form_for(@othertask, url: "/other_task", :html =>{:method => :post}) do |f| %>
 <%= select_tag "country", options_for_select([], params[:country]), {:multiple => false, :class => "countries", :'data-country' => "IN", :id => "countries_states1"} %>
 <%= select_tag :state, options_for_select([], params[:state]), { :class => "states", :'data-country' => "countries_states1", :'data-state' => ""} %>
 <%= text_field_tag :city, params[:city], :placeholder => "City"%>                
 <%= text_field_tag :dob, params[:dob], :placeholder => "date of birth", :id => "dp2" %>
 <%= select_tag :highlyeducation, options_for_select(["ME/MTech","MCom","MCA","BE/BTech","MBA","BCA/BSc","BCom"], params[:higheducation]), {:multiple => false} %>
 <%= radio_button_tag :gender,'Male', params[:male] %>Male
 <%= radio_button_tag :gender,'Female', params[:female] %>Female <br/><br/>
 <%= f.submit "Search", class: "btn btn-large" %>

これが私のコントローラーです-

  def create

    if @other_tasks = Micropost.joins(:user).where('users.city' => params[:city], 'users.country' => params[:country])  
    render 'index'
    else
      @other_tasks = []
    render 'index'
    end
 end    

ユーザーは、0、1、2、またはすべてのフィールドに入力して検索できます。このために私がすべてのタスクをフェッチするためにすべての可能な組み合わせを作るならば、それは書くためにたくさんのクエリを必要とします。1つのクエリのみを使用して、ユーザー入力に基づいてタスクをフェッチするにはどうすればよいですか。

4

1 に答える 1

0

タスクがドメイン内のマイクロポストにどのように接続されているのか、タスクを検索するために create アクションを使用する理由がわかりませんでした。これらの事項を明確にすることで、より良い回答が得られると思います。

必要なことは、検索可能なすべてのフィールドを配列にグループ化し、params でそのフィールドに対して受け取った値が空白でない場合は常にフィルターを適用することです。

def create
  @other_tasks =  Micropost.joins(:user)
  search_fields = [:country, :state, :city, :dob, :highlyeducation]
  search_fields.each do |f|
    @other_tasks = @other_tasks.where("users.#{f} = ?", params[f]) unless params[f].blank?
  end
  render :index
end
于 2013-01-23T09:12:23.423 に答える