我遇到了 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/