mongoid $ in:语句如果值为空数组,如何忽略字段?

时间:2017-03-30 23:05:32

标签: ruby mongoid

所以,我有一个项目数据库,我正在编写一个搜索查询。我希望用户能够选择他们使用或不使用的字段,他们不需要填写所有字段。用户忽略的任何字段我不希望查询受到未选择的内容的限制。

如果用户在html表单中跳过proposal_status:,我不希望查询通过空白数组限制搜索。如果proposal_status是一个空白数组,如何更改我的查询以忽略params[:status]行?

Project.where(
  job_number: /#{params[:job_number]}/i,
  project_name: /#{params[:project_name]}/i,
  proposal_status: {:$in => params[:status] } # params[:status] == []
)

1 个答案:

答案 0 :(得分:0)

这两个查询是等价的:

Project.where(
  job_number: /#{params[:job_number]}/i,
  project_name: /#{params[:project_name]}/i,
  proposal_status: {:$in => params[:status] }
)

Project.where(job_number: /#{params[:job_number]}/i)
       .where(project_name: /#{params[:project_name]}/i)
       .where(proposal_status: {:$in => params[:status] })

如果你逐个构建查询,那么遗漏一件很容易:

q = Project.where(job_number: /#{params[:job_number]}/i)
q = q.where(project_name: /#{params[:project_name]}/i)
q = q.where(proposal_status: {:$in => params[:status] }) if(params[:status].present?)

此外,Mongoid补丁(或至少用于)某些方法到Symbol,所以你可以说:

where(:proposal_status.in => params[:status])
# --------------------^^^

简化事情(除非他们当然不再这样做了。)