Ruby on rails Rails:基于Mongoid数据库的下拉列表创建搜索过滤器

Ruby on rails Rails:基于Mongoid数据库的下拉列表创建搜索过滤器,ruby-on-rails,mongodb,mongoid,Ruby On Rails,Mongodb,Mongoid,在我的索引页面上,我有一些下拉列表,用户可以选择它们作为搜索Mongo集合的过滤器。这些下拉列表对应于在我的模型中设置的字段。还有一个打开的文本输入字段,可用于搜索集合中的文本字段“方案名称”和“方案正文”。我似乎找不到多少关于如何链接Mongoid查询以缩小搜索结果范围的文档 index.erb视图页面有一个form_标签,其中包含用于我希望用户搜索的字段的各种选择器,以及用于场景名称和正文字段的文本输入 这是我的索引控制器: def index @scenarios = if param

在我的索引页面上,我有一些下拉列表,用户可以选择它们作为搜索Mongo集合的过滤器。这些下拉列表对应于在我的模型中设置的字段。还有一个打开的文本输入字段,可用于搜索集合中的文本字段“方案名称”和“方案正文”。我似乎找不到多少关于如何链接Mongoid查询以缩小搜索结果范围的文档

index.erb视图页面有一个
form_标签
,其中包含用于我希望用户搜索的字段的各种选择器,以及用于场景名称和正文字段的文本输入

这是我的索引控制器:

  def index
@scenarios = if params[:search]
               Scenario.search(params)
             else
               Scenario.all
             end
end
以及我的“场景”模型:


我应该如何创建一个可以过滤一个、多个、所有下拉选项和开放式文本搜索的方法或查询?

我就是这样做的。虽然看起来不太像rails,但它很有效

在场景模型中:

  def self.search(search)
    search_array = [{scenario_name: (/.*#{search[:search]}.*/i if search[:search].present?)},
                    {scenario_body: (/.*#{search[:search]}.*/i if search[:search].present?)}]

    search_array.map {|a| a.reject! {|k, v| v.nil?}}
    search_array.delete_if {|hash| hash.empty?}

    select_array = [{submitter: (search[:submitter] if search[:submitter].present?)},
                    {test_type: (search[:test_type] if search[:test_type].present?)},
                    {application: (search[:application] if search[:application].present?)},
                    {pillar: (search[:pillar] if search[:pillar].present?)}]

    select_array.map {|a| a.reject! {|k, v| v.nil?}}
    select_array.delete_if {|hash| hash.empty?}

    mongo_query = ['$and' => (select_array if select_array.present?), '$or' => (search_array if search_array.present?)]
    mongo_query.map {|a| a.reject! {|k, v| v.nil?}}
    mongo_query.delete_if {|hash| hash.empty?}

    where(mongo_query[0]).to_a
  end

您希望该字段过滤什么?mongo文档上的另一个字段?已定义的字段之一?你可以做
.where(field:params[:open_field]),如果params[:open_field]。现在?
或者类似的事情,我想你可以解释得更清楚一些。@arieljuod,我希望所选的下拉字段过滤Mongo中“scenarios”集合的搜索结果。我有一个下拉选项“austin”用于提交者字段,只有提交“奥斯汀”的人才能带回文件。对于其他字段,这些字段也应该链接在一起。我会更新问题,谢谢!
  def self.search(search)
    search_array = [{scenario_name: (/.*#{search[:search]}.*/i if search[:search].present?)},
                    {scenario_body: (/.*#{search[:search]}.*/i if search[:search].present?)}]

    search_array.map {|a| a.reject! {|k, v| v.nil?}}
    search_array.delete_if {|hash| hash.empty?}

    select_array = [{submitter: (search[:submitter] if search[:submitter].present?)},
                    {test_type: (search[:test_type] if search[:test_type].present?)},
                    {application: (search[:application] if search[:application].present?)},
                    {pillar: (search[:pillar] if search[:pillar].present?)}]

    select_array.map {|a| a.reject! {|k, v| v.nil?}}
    select_array.delete_if {|hash| hash.empty?}

    mongo_query = ['$and' => (select_array if select_array.present?), '$or' => (search_array if search_array.present?)]
    mongo_query.map {|a| a.reject! {|k, v| v.nil?}}
    mongo_query.delete_if {|hash| hash.empty?}

    where(mongo_query[0]).to_a
  end