2016-04-01 3 views
1

Ich versuche ein Dokumenten-Management-System zu erstellen, wo der Benutzer Dokumente nach Thema oder nach Datum suchen kann. Es funktioniert gut, wenn beide Parameter Werte haben oder beide leer sind. Aber wenn man leer ist, beginnen die Dinge schief zu laufen.Rails + Searchkick Suche auf leere Parameter

Ich verwende params[:search], um durch das Thema Feld zu suchen, während params[:date_filter] für die Datumsfelder verwendet wird.

Fall 1: params[:search] ist leer, params[:date_filter] ist vorhanden. Suche gibt nichts zurück.

Fall 2: params[:search] ist vorhanden, params[:date_filter] ist leer. Suchergebnisse in ArgumentError invalid date

Während ich denke, ich kann diese Probleme beheben, indem Sie einen verschachtelten if Klauseln setzen, würde Ich mag, um Hilfe fragen, ob es eine elegantere Lösung ist vor allem, wenn ich der Meinung, dass mehr Parameter würden mehr if Klauseln bedeuten .

Hier ist der Code, den ich in meinem Controller bin:

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 

Update: eine modifizierte Version der verwendeten @ Code des CupawnTae das Problem

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) 

Antwort

0

Wie wäre es, so etwas zu lösen ?

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) 
+0

Danke, aber jetzt ignoriert es meine Datumseingaben und aus irgendeinem Grund geben die '@ ingoing' und' @ outgoing' Variablen dasselbe aus. –

+0

oops, sorry, hab hier keinen sucher zum testen - ich habe 'wo' in den suchparametern verpasst - probier den aktualisierten code – CupawnTae

+0

Vielen Dank! Ich musste einige Bits modifizieren, weil sie Fehler oder leere Ergebnisse hervorriefen, aber es funktionierte am Ende. –