2016-09-20 2 views
0

ich habe diese Anfrage:wenn im Inneren, wo Abfrage auf Schienen

def self.search(nombre,zona,tipoActividad,fechaInicio,fechaFin,nombreProfesor) 

    where("nombre) iLIKE ? or contenido iLIKE ? or descripcion iLIKE ? ", "%#{nombre}%", "%#{nombre}%","%#{nombre}%") 
     .where("lugar iLIKE ?", "%#{zona}%") 
     .where("tipo_actividad iLIKE ?", "%#{tipoActividad}%") 
     .where(['fecha_inicio >= ?', fechaInicio]) ***if !fechaInicio.blank?*** 
     .where(['fecha_fin <= ?', fechaFin]) ***if !fechaFin.blank?*** 
     .joins(:user).where("users.lastname iLIKE ?", "%#{nombreProfesor}%") 
    end 

Ich habe das Problem, wenn ich von fecha_fin und fecha_inicio zu filtern haben. Ich muss nur nach ihnen filtern, wenn die Parameter vorhanden sind. Wie kann ich die Abfrage erneut ändern?

Danke.

Antwort

2

Ihre self.search Methode erstellt und gibt eine Kette von Beziehungsoperationen zurück.

Sie müssen also die Logik in einer Variablen speichern, die Kette nach Bedarf hinzufügen und dann die Beziehung zurückgeben.

def self.search(nombre, zona, tipo_actividad, fecha_inicio, fecha_fin, nombre_profesor) 
    relation = where("nombre) iLIKE ? or contenido iLIKE ? or descripcion iLIKE ? ", "%#{nombre}%", "%#{nombre}%","%#{nombre}%") 
      .where("lugar iLIKE ?", "%#{zona}%") 
      .where("tipo_actividad iLIKE ?", "%#{tipo_actividad}%") 

    relation = relation.where('fecha_inicio >= ?', fecha_inicio) if fecha_inicio.present? 
    relation = relation.where('fecha_fin <= ?', fecha_fin) if fecha_fin.present? 

    relation = relation.joins(:user).where("users.lastname iLIKE ?", "%#{nombreProfesor}%") 

    return relation 
end