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

mongoid $in: statement how do I ignore a field if the value is a blank array?

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

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

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

这两个查询是等价的:

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])
# --------------------^^^

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