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)