繁体   English   中英

轨道上的红宝石,过滤器的链式命令

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM