Ruby on rails Rails:基于Mongoid数据库的下拉列表创建搜索过滤器
在我的索引页面上,我有一些下拉列表,用户可以选择它们作为搜索Mongo集合的过滤器。这些下拉列表对应于在我的模型中设置的字段。还有一个打开的文本输入字段,可用于搜索集合中的文本字段“方案名称”和“方案正文”。我似乎找不到多少关于如何链接Mongoid查询以缩小搜索结果范围的文档 index.erb视图页面有一个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
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