2016-08-09 2 views
0

비디오 시청이 끝났을 때 아약스를 실행할 수 있도록 앱을 설치했습니다. ajax는 아래 User # 액션을 호출합니다. 문제는 처음 실행될 때 { "timestamp"=> "1"}을 추가하지만 { "timestamp"=> "1,1"}로 업데이트되지 않습니다. 제가 누락 된 것이 있습니까? hstore 해시 값을 업데이트 할 수 없습니까?레일 앱의 hstore에 해시 값 추가하기

# 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 전환 할 수 있습니다.