【发布时间】:2017-09-08 04:58:39
【问题描述】:
我遇到了 Rails 中的范围问题。目前,我在索引控制器中有一个 case 语句,它导致应用程序要么过滤 1 个类别 OR 另一个类别。 但我需要能够同时过滤多个内容。基本上是链接范围,因此当用户单击链接 A 时,将应用范围 A,然后当他们单击链接 B 时,将范围 B 添加到范围 A 的顶部以进行更多过滤。最终我想在视图中添加一个复选框,以便在选中时应用范围,而在取消选中时删除范围。
我现在使用一堆条件逻辑 (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 />
这是我的控制器的索引操作,我认为需要进行更改才能一次应用多个范围。
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
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-5