Rails + Searchkick搜索空参数

时间:2016-04-01 08:48:32

标签: ruby-on-rails searchkick

我正在尝试创建一个文档管理系统,用户可以按主题或按日期搜索文档。当两个参数都有值或两者都为空时,它工作正常。但是当一个人空着时,情况就会开始出错。

我使用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

1 个答案:

答案 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)