2016-08-09 41 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 = { :k => 11 } 
h[:k] = 6 

然後h本身實際上並沒有改變,它的內容發生了變化,但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),而不必擔心內部表示醜陋的細節。

您可能還需要從hstore切換到jsonb此列,那麼你可以使用一個數組作爲值({"timestamp": [0,1]}),而不是某種CSV-IN-A-串像你正在做。