ruby-on-rails - 使用范围来过滤 Rails 5 中的结果

标签 ruby-on-rails ruby-on-rails-5

我遇到了 Rails 范围的问题。目前,我在索引 Controller 中有一个 case 语句,导致应用程序过滤 1 个类别另一个类别。 但我需要能够同时过滤多个内容。基本上是为了链接范围,这样当用户单击链接 A 时,将应用范围 A,然后当用户单击链接 B 时,范围 B 会添加到范围 A 的顶部以进行更多过滤。最后,我想在 View 中添加一个复选框,以便在选中该复选框时应用范围,而在取消选中时则删除范围。

我现在使用了一堆条件逻辑(if\else)语句,因为我不仅仅需要过滤“经验”,我需要过滤 4 种不同的经验选项(0-2 年, 2-5年,5-10年,等等...)。这对于所有范围都是相同的。

所以总而言之,我需要找到一种方法来链接范围,以便过滤器不断被应用(过滤器 A + 过滤器 B + 过滤器 C 等...),而不是让它们像现在那样是过滤器A 或过滤器 B,但无法让它们一起工作以进一步缩小结果范围。

这是我的范围

scope :by_experience, -> (ex) { where(experience: ex) }

scope :by_num_days_past, -> (days_past) { where('created_at >= ?', days_past.days.ago) }

这是我的观点

            <!-- toggle for experience -->  
            <a class="" role="" data-toggle="collapse" 
href="#experience-collapse" aria-expanded="false" aria-
controls="experience-collapse">
                Experience<br />
            </a>
            <div class="collapse" id="experience-collapse">
              <div class="well">
                <%= link_to "0-2 years", filtered_jobs_path(:experience, '0-2 years') %><br />
                <%= link_to "2-5 years", filtered_jobs_path(:experience, '2-5 years') %><br />
                <%= link_to "5-10 years", filtered_jobs_path(:experience, '5-10 years') %><br />
                <%= link_to "10+ years", filtered_jobs_path(:experience, '10+ years') %>        
              </div>
            </div>  
            <br />            

    

            <!-- toggle for num_days_past -->  
            <a class="" role="" data-toggle="collapse" href="#num-days-
past-collapse" aria-expanded="false" aria-controls="num-days-past-
collapse">
                Days Listed<br />
            </a>
            <div class="collapse" id="num-days-past-collapse">
              <div class="well">
                <%= link_to "7 days", filtered_jobs_path(:num_days_past, '7') %><br />
                <%= link_to "30 days", filtered_jobs_path(:num_days_past, '30') %><br />
                <%= link_to "60 days", filtered_jobs_path(:num_days_past, '60') %><br />
              </div>
            </div>  
            <br />   

这是我的 Controller 的索引操作,我认为需要进行更改才能同时应用多个范围。

def index

      case params[:scope]  
      when "num_days_past"
        if (params[:format] == "7")
          @jobs = Job.by_num_days_past("7").paginate(page: params[:page], per_page: 5)     
        elsif (params[:format] == "30")
          @jobs = Job.by_num_days_past("30").paginate(page: params[:page], per_page: 5)     
        elsif (params[:format] == "60")
          @jobs = Job.by_num_days_past("60").paginate(page: params[:page], per_page: 5)  
         else   
             @jobs = Job.order('created_at DESC').paginate(page: params[:page], per_page: 5)        
         end      
end

最佳答案

在实例变量上调用多个作用域会使它们链接起来。请尝试以下操作:

def index

    @jobs = Job.by_num_days_past("7") if (params[:format] == "7")     
    @jobs = @jobs&.by_num_days_past("30") || Job.by_num_days_past("30") if (params[:format] == "30")        
    @jobs = @jobs&.by_num_days_past("60") || Job.by_num_days_past("60") if (params[:format] == "60")         
    @jobs = Job.order('created_at DESC') if @jobs.blank?
    @jobs.paginate(page: params[:page], per_page: 5)

end

关于ruby-on-rails - 使用范围来过滤 Rails 5 中的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46045136/

相关文章:

ruby-on-rails - Rails 5 - 更新时手动将属性添加到 Controller 中的参数

ruby-on-rails - 无法在 Rails 中使用 ActiveStorage 创建文件字段

ruby-on-rails - OneLogin SAML 身份验证后的 Web 重定向

ruby-on-rails - Rails 形式测试 : post directly or through form?

ruby-on-rails-5 - Rails5,如何重试执行 ActiveJob 特定次数(最大尝试次数)

api - Rails 5 仅限 api 的应用程序,带有主页

ruby-on-rails - 如何在 Paperclip 中制作条件样式?

javascript - 是否可以在没有 link_to 的情况下呈现部分 onclick?

javascript - 使用hidden_​​field_tag帮助器将JavaScript变量的值传递到Rails View

ruby-on-rails - 使用 fields_for 的 Rails 错误消息