2016-08-09 4 views
0

ビデオが見終わったときにajaxを実行するように私のアプリケーションをセットアップしました。 ajaxは以下のUser#アクションを呼び出します。問題は、最初に実行されたときに動作し、{"timestamp" => "1"}追加されますが、{"timestamp" => "1,1"}には更新されません。私が紛失しているものはありますか? hstoreハッシュの値を更新できないのですか?hstoreのハッシュ値にRailsアプリケーションのために追加

# 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 

答えて

0

ActiveRecordはあなたがnewworkoutsを変更したことを認識していないと思います。あなたがこれを行う場合:

h = { } 
h[:k] = 6 

またはこれを:その後、h自身が実際に変更されていません

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

、その内容は変更されているが、それは後にあるようh.object_idh[:k] = 6前と同じです。 PostgreSQL array columns and ActiveRecordで同様のことが起こる可能性があるので、同様の問題を抱えるhstoreが驚くことはありません。

ソリューションは、配列と同じでなければならない:

  1. 本当にハッシュを変更します。

    w = @user.newworkouts.dup 
    # update `w` as needed... 
    @user.newworkouts = w # Replace the reference 
    @user.save 
    
  2. 手動で汚れているとマークします。

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

私はまた、あなただけの内部表現の醜い詳細を心配する必要があなたのコントローラで@user.add_workout_at(Time.now)を言っていない可能性があり、あなたのモデルに方法でそのログインを埋め込むお勧めします。

あなたはまた、あなたが値({"timestamp": [0,1]})のではなく、あなたが現在やっているようなCSV・イン・ザ・文字列のいくつかの並べ替えとして配列を使用することができ、この列にjsonbhstoreから切り替えたいかもしれません。

関連する問題