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)
Danke, aber jetzt ignoriert es meine Datumseingaben und aus irgendeinem Grund geben die '@ ingoing' und' @ outgoing' Variablen dasselbe aus. –
oops, sorry, hab hier keinen sucher zum testen - ich habe 'wo' in den suchparametern verpasst - probier den aktualisierten code – CupawnTae
Vielen Dank! Ich musste einige Bits modifizieren, weil sie Fehler oder leere Ergebnisse hervorriefen, aber es funktionierte am Ende. –