2016-08-09 2 views
0

Ich habe meine App-Setup für AJAX ausführen, wenn ein Video fertig ist zu beobachten. Der Ajax ruft unten eine User # -Aktion auf. Das Problem ist, wenn es zum ersten Mal ausgeführt wird, funktioniert es und fügt {"timestamp" => "1"} hinzu, aber es wird nie auf {"timestamp" => "1,1"} aktualisiert. Gibt es etwas, das mir fehlt? Kann ich den Wert in einem Hstore-Hash nicht aktualisieren?Hinzufügen zu Hash-Wert in Hstore für Rails App

# Increases User's workouts after video is watched 
    def increase_workouts 
     @user = current_user 
     if logged_in? 
     if @user.newworkouts[Time.now.strftime("%Y%m%d").to_sym] == nil 
      @user.newworkouts[Time.now.strftime("%Y%m%d").to_sym] = "0" 
     end 
     @user.newworkouts[Time.now.strftime("%Y%m%d").to_sym] += "," + "1" 
     @user.save 
     render(json: { message: "Workouts increased" }, status: :ok) and return 
     else 
     render(json: { message: "Workouts increased" }, status: :ok) and return 
     end 
    end 

Antwort

0

Ich denke ActiveRecord erkennt nicht, dass Sie newworkouts geändert haben. Wenn Sie dies tun:

h = { } 
h[:k] = 6 

oder dies:

h = { :k => 11 } 
h[:k] = 6 

dann h sich nicht wirklich geändert hat, haben ihr Inhalt geändert, aber h.object_id ist das gleiche vor h[:k] = 6, wie es nach ist. Ähnliche Dinge können passieren mit PostgreSQL array columns and ActiveRecord so hstore leiden ähnliche Probleme wäre nicht überraschend.

Die Lösungen sollen die gleichen wie bei Arrays:

  1. wirklich den Hash ändern.

    w = @user.newworkouts.dup 
    # update `w` as needed... 
    @user.newworkouts = w # Replace the reference 
    @user.save 
    
  2. Manuell als schmutzig markieren.

    # Update @user.newworkouts as you are now... 
    @user.newworkouts_will_change! # Mark it as dirty. 
    @user.save 
    

ich auch empfehlen würde, dass die Anmeldung bei einem Verfahren nach Modell zu begraben, dann könnte man nur @user.add_workout_at(Time.now) in Ihrem Controller sagt und über die hässlichen Details der internen Darstellung sorgen musst nicht.

Sie könnten auch hstore-jsonb für diese Spalte wechseln möchten, dann können Sie ein Array als Wert ({"timestamp": [0,1]}) eher als eine Art von CSV-in-a-String wie Sie verwenden sind zur Zeit tun.

Verwandte Themen