通过子对象通过has_many的id过滤索引页面

时间:2014-01-05 17:03:26

标签: ruby-on-rails slim-lang

我有一个乔布斯的索引页面。城市和职位都有着与工作的关系。

在工作索引页面上,我有一个小的搜索表单,我想用它来过滤用户选择的城市和职位组合的结果。

这是迄今为止的样子

工作#索引

- provide(:title, 'All Jobs')

.thinstripe_career
  .darken
    .container
      .row
        .span10.offset1
          .jobs_header
            .row
              .span7
                h2 All #{@city.name if @city} #{@position.name if @position} Jobs 
              .span3
                == link_to "Sign up for Job Alerts!", "#", :class => "button"

- if current_user && current_user.admin? 
  == render 'shared/dashboard_header' 

.container
  .row
    .span10.offset1
      .job_search
        == form_tag jobs_path, :method => 'get', :id => "jobs_filter" do
          h2 I'd like jobs in
          .filter_sect
            == select_tag :city_id, options_from_collection_for_select(@cities, "id", "name"), :class => "basic" 
          .filter_sect
            == select_tag :position_id, options_from_collection_for_select(@positions, "id", "name"), :class => "basic"             
          .filter_sect.filter_search
            == submit_tag "Search", :class => "button search_button button_black"

      ul.jobs
        == render @jobs

      == will_paginate

工作#索引控制器

  def index     
    @cities = City.all
    @positions = Position.all

    @city = City.find(params[:city_id]) if params[:city_id]
    @position = Position.find(params[:position_id]) if params[:position_id]

    @jobs = Job.paginate(page: params[:page])
  end

我想@jobs过滤购买@city或@position。

条件是如果@city不存在,它只按@position过滤,反之亦然。 如果两者都不存在,那么它只是对所有作业进行分页。但是,我想到的所有代码都很长,并且使用if语句,因此我认为我走错了路。

我如何通过@city和@position过滤@jobs?

1 个答案:

答案 0 :(得分:1)

执行查询时,您可以利用AND加入调用的多个条件:

@jobs = Job
@jobs = @jobs.includes(:cities).where(cities: { id: @city }) if @city
@jobs = @jobs.where(position_id: @position) if @position
@jobs = @jobs.paginate(page: params[:page], per_page: 5)