我正在尝试创建一个文档管理系统,用户可以按主题或按日期搜索文档。当两个参数都有值或两者都为空时,它工作正常。但是当一个人空着时,情况就会开始出错。
我使用params[:search]
搜索主题字段,而params[:date_filter]
用于日期字段。
案例1:params[:search]
为空,params[:date_filter]
存在。搜索没有返回任何内容。
案例2:params[:search]
存在,params[:date_filter]
为空。在ArgumentError invalid date
虽然我认为我可以通过将它们置于嵌套的if
子句中来解决这些问题,但如果有更优雅的解决方案,我想请求帮助,特别是如果我认为更多参数意味着更多{{1条款。
以下是我在控制器中使用的代码:
if
更新: 使用@ CupawnTae代码的修改版本来解决问题
if params[:search].present? || params[:date_filter].present?
@ingoing = Document.search(
params[:search],
where: {
outgoing: false,
date: {
gte: DateTime.strptime(params[:date_filter], '%m/%d/%Y %l:%M %p').beginning_of_day,
lte: DateTime.strptime(params[:date_filter], '%m/%d/%Y %l:%M %p').end_of_day
}
},
order: {created_at: :desc} )
@outgoing = Document.search(
params[:search],
where: {
outgoing: true,
date: {
gte: DateTime.strptime(params[:date_filter], '%m/%d/%Y %l:%M %p').beginning_of_day,
lte: DateTime.strptime(params[:date_filter], '%m/%d/%Y %l:%M %p').end_of_day
}
},
order: {created_at: :desc} )
else
@documents = Document.all
@ingoing = @documents.where(outgoing: false).order('created_at desc')
@outgoing = @documents.where(outgoing: true).order('created_at desc')
end
答案 0 :(得分:0)
这样的事情怎么样?
search = params[:search].present? ? params[:search] : "*"
where = {order: {created_at: :desc}}
if params[:date_filter].present?
where[:date] = {
gte: DateTime.strptime(params[:date_filter], '%m/%d/%Y %l:%M %p').beginning_of_day,
lte: DateTime.strptime(params[:date_filter], '%m/%d/%Y %l:%M %p').end_of_day
}
end
@ingoing = Document.search search, where: where.merge(:outgoing => false)
@outgoing = Document.search search, where: where.merge(:outgoing => true)