[英]ruby on rails, chain commands for filters
一个小问题,我有一个仅显示即将发生的事件的命令,这很好
@events = Event.where("startdate >= ?", Date.today).order("startdate, starttime")
现在我有一个仅选择目标组的过滤器。 例如男人,女人。
case params[:filter]
when "Men"
@events = Event.men
when "Women"
@events = Event.women
when "Juniors"
@events = Event.juniors
else
@events = Event.all
现在的问题是,我想将这两个过滤器组合在一起,更多的是,我不需要在每一行都重复“ .where(...)”。 解决该问题的好方法是什么。 我是否需要更新示波器,例如男人,女人,以便它们仅显示即将发生的事件,或者我可以在控制器中解决该问题?
干杯兰尼
当您调用Event.men
或其他作用域时,不会立即对其进行评估。 因此,如果params[:filter] = 'Men'
,
case params[:filter]
when "Men"
@events = Event.men
when "Women"
@events = Event.women
when "Juniors"
@events = Event.juniors
else
@events = Event.all
end
@events = @events.where("startdate >= ?", Date.today).order("startdate, starttime")
将构建一个表达式:
@events = Event.men.where("startdate >= ?", Date.today).order("startdate, starttime")
只有这样,它才会从数据库中获取。
很难弄清楚Event.women是什么,但我将假设events表中有一些type列。
在这种情况下,我将在Event上创建一个这样的方法:
def self.upcoming type
Event.where("startdate >= ? and type = ?", Date.today, type).order("startdate, starttime")
end
并正确处理您的默认情况。 将开关置于类方法中。 在我看来,将其包含在控制器中是一种代码异味。
这是一个ActiveRecord::Relation
:
@events = Event.where("startdate >= ?", Date.today)
.order("startdate, starttime")
在某种迫使它具体化之前,它仍然是潜在的条件链。
这意味着您可以继续为@events
关系添加条件,就像Felix的回答一样。
我个人喜欢用私有方法提取这种逻辑:
class MyController < ApplicationController
def index
@events = Event.where("startdate >= ?", Date.today)
.order("startdate, starttime")
@events = apply_type_filter(@events)
end
private
def apply_type_filter(relation)
case params[:filter]
when "Men"
relation.men
when "Women"
relation.women
when "Juniors"
relation.juniors
else
relation
end
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.