2016-07-07 8 views
2

Ich verwende Rails 4.2.3. Ich habe Probleme, eine variable Anzahl von Suchkriterien an meine Rails-Finder-Methode zu übergeben. Ich habe"Falsche Anzahl von Bind-Variablen" erhalten, wenn ich versuche, eine Rails-Finder-Methode zu schreiben

user = current_user 
    search_criteria = ["my_objects.user_id = ?"] 
    search_values = [user.id] 
    start_date = params[:start_date] 
    if start_date.present? 
     start_date_obj = Date.strptime(start_date, "%m/%d/%Y") 
     search_criteria.push("my_objects.start_date >= ?") 
     search_values.push(start_date_obj) 
    else 
     start_date = my_object.find_user_first_my_object_date(user) 
     @default_start_date = start_date.to_time.strftime("%m/%d/%Y") if start_date.present? 
    end 
    end_date = params[:end_date] 
    if end_date.present? 
     end_date_obj = Date.strptime(end_date, "%m/%d/%Y") 
     search_criteria.push("my_objects.end_date <= ?") 
     search_values.push(end_date_obj) 
    else 
     end_date = my_object.find_user_last_my_object_date(user) 
     @default_end_date = end_date.to_time.strftime("%m/%d/%Y") if end_date.present? 
    end 
    distance = params[:distance] 
    if distance.present? 
     distance_parts = distance.split(" ") 
     search_criteria.push("my_objects.distance = ?") 
     search_criteria.push("my_objects.distance_unit_id = ?") 
     search_values.push("#{distance_parts[0]}") 
     search_values.push("#{distance_parts[1]}") 
    end 
    @user_my_objects = MyObjectTime.joins(:my_object).where(search_criteria.join(" AND "), search_values) 
              .order("my_objects.day") 

Aber dies führt zu dem Fehler

wrong number of bind variables (1 for 5) in: my_objects.user_id = ? AND my_objects.start_date >= ? AND my_objects.end_date <= ? AND my_objects.distance = ? AND my_objects.distance_unit_id = ? 

Ich denke, Rails mein „search_values“ Array als ein einziger Wert behandelt, aber ich möchte es als Argument jeden Wert des Arrays zu übergeben in die Suchbedingung. Wie repariere ich das oben genannte?

Antwort

3

Wenn ich die Frage richtig gelesen habe, kocht dies auf

values = ['a', 'b', 'c'] 
SomeModel.where("foo = ? AND bar = ? AND baz = ?", values) 

eine Fehlermeldung über eine falsche Anzahl von Bindevariablen Werfen. Um ein Array zu auspacken und nutzen ihre Werte als einzelne Argumente Sie Splat-Operator verwenden:

SomeModel.where("foo = ? AND bar = ? AND baz = ?", *values) 
+0

Als Randbemerkung, versuchen und kondensieren die Menge an Code, den Sie in Frage gestellt - Streifen um das entsprechende Bit aus (der wo Anruf und seine Parameter) aus dem Rauschen (Ihr Parameter Parsing-Code). –

Verwandte Themen