Rails+Searchkick 搜索空参数
Rails+Searchkick search on empty params
我正在尝试创建一个文档管理系统,用户可以在其中按主题或日期搜索文档。当两个参数都有值或都为空时,它工作正常。但是当一个空的时候,事情就开始出错了。
我使用 params[:search]
搜索主题字段,而 params[:date_filter]
用于日期字段。
情况 1:params[:search]
为空,params[:date_filter]
存在。搜索 returns 什么都没有。
情况 2:params[:search]
存在,params[:date_filter]
为空。 ArgumentError invalid date
中的搜索结果
虽然我认为我可以通过将它们放在嵌套的 if
子句中来解决这些问题,但如果有更优雅的解决方案,我想寻求帮助,特别是如果我认为更多参数意味着更多 if
条款。
这是我在控制器中使用的代码:
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
更新:
使用@CupawnTae 代码的修改版本来解决问题
search = params[:search].present? ? params[:search] : "*"
#where = {order: {created_at: :desc}}
#This kept throwing an unknown where operand error so I changed it
#Also can't put misspellings: false here since it keeps returning empty results
where = {}
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
#Put the order here, as well as the misspelling option since putting it at the top returned empty results.
@ingoing = Document.search( search, where: where.merge(:outgoing => false), order: {created_at: :desc}, misspellings: false )
@outgoing = Document.search( search, where: where.merge(:outgoing => true), order: {created_at: :desc}, misspellings: false )
这样的怎么样?
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)
我正在尝试创建一个文档管理系统,用户可以在其中按主题或日期搜索文档。当两个参数都有值或都为空时,它工作正常。但是当一个空的时候,事情就开始出错了。
我使用 params[:search]
搜索主题字段,而 params[:date_filter]
用于日期字段。
情况 1:params[:search]
为空,params[:date_filter]
存在。搜索 returns 什么都没有。
情况 2:params[:search]
存在,params[:date_filter]
为空。 ArgumentError invalid date
虽然我认为我可以通过将它们放在嵌套的 if
子句中来解决这些问题,但如果有更优雅的解决方案,我想寻求帮助,特别是如果我认为更多参数意味着更多 if
条款。
这是我在控制器中使用的代码:
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
更新: 使用@CupawnTae 代码的修改版本来解决问题
search = params[:search].present? ? params[:search] : "*"
#where = {order: {created_at: :desc}}
#This kept throwing an unknown where operand error so I changed it
#Also can't put misspellings: false here since it keeps returning empty results
where = {}
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
#Put the order here, as well as the misspelling option since putting it at the top returned empty results.
@ingoing = Document.search( search, where: where.merge(:outgoing => false), order: {created_at: :desc}, misspellings: false )
@outgoing = Document.search( search, where: where.merge(:outgoing => true), order: {created_at: :desc}, misspellings: false )
这样的怎么样?
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)