代码之家  ›  专栏  ›  技术社区  ›  hadees

如何按多个字段筛选结果?

  •  2
  • hadees  · 技术社区  · 15 年前

    我正在RubyonRails上开发一个调查应用程序,在结果页面上,我想让用户根据我在调查开始时提出的一系列人口统计问题筛选答案。

    例如,我问用户他们的性别和职业是什么。所以我在考虑性别和事业的下降。这两个下拉列表都默认为“全部”,但如果用户选择了女性和营销人员,那么我的结果页面只能回答女性营销人员的问题。

    我认为正确的方法是使用命名范围,在这个例子中,我为我的每一个人口问题都有一个命名范围,在这个例子中,性别和职业,从下拉列表中得到一个净化的值,在条件下使用,但我不确定如何动态创建命名范围链,因为我有5个人口调查。离子,大概其中一些会被设置为全部。

    3 回复  |  直到 11 年前
        1
  •  7
  •   Jason Weathered    14 年前

    您可以将命名的作用域链接在一起:

    def index
      @results = Results.scoped
      @results = @results.gender(params[:gender]) unless params[:gender].blank?
      @results = @results.career(params[:career]) unless params[:career].blank?
    end
    

    但是我更喜欢用 has_scope 宝石:

    has_scope :gender
    has_scope :career
    
    def index
      @results = apply_scopes(Results).all
    end
    

    如果你使用 哈斯镜 具有 inherited_resources 您甚至不需要定义索引操作。

        2
  •  3
  •   dombesz    15 年前
     named_scope :gender,lambda { |*args|
        unless args.first.blank?
          { :conditions => [ "gender = ?", args.first] }   
        end
      }
    

    如果以这种方式编写命名作用域,则可以将所有作用域链接起来,如果其中一个参数为空,则不会中断。

    Result.gender("Male") will return male results.
    Result.gender("") will return male and female too.
    

    你可以像这样链接你的所有方法。最后,作为一种过滤,您可以有如下内容:

    Result.age(16).gender("male").career("beginer")
    Result.age(nil).gender("").career("advanced") - will return results with advanced career, etc.
    
        3
  •  0
  •   Daniel Antonio Nuñez Carhuayo    11 年前

    尝试以下方法:

    VistaFact.where( if active then {:field => :vista2} else {} end)
    

    或者像这样:

    VistaFact.where(!data.blank? ? {:field=>data.strip} : {}).where(some? ? {:field2 => :data2} : {}).where ...
    

    那对我很好!