2016-06-23 2 views
6

는 내가 열에 jsonb 데이터 유형을 사용하는 모델 ProjectKeyword을 :segemnted_data루비는

class ProjectKeyword < ApplicationRecord 
    belongs_to :project 
    belongs_to :keyword 
    has_many :project_keyword_dimensions 
    has_many :dimensions, through: :project_keyword_dimensions 

    validates :project_id, :keyword_id, presence: true 
end 

마이그레이션

class AddSegemtnedDataToProjectKeywords < ActiveRecord::Migration[5.0] 
    def change 
    add_column :project_keywords, :segmented_data, :jsonb, default: '{}' 
    add_index :project_keywords, :segmented_data, using: :gin 
    end 
end 

내 문제는 내가 기본 새 project_keyword 인스턴스를 만들 때되어 있습니다 segmented_data의 값은 해시가 아닌 문자열이며이 필드를 업데이트하거나 다른 해시와 병합 할 수 없습니다. 예 :

[12] pry(#)> new_pr_keyword = ProjectKeyword.new(project_id: 1671333, keyword_id: 39155) 
=> #<ProjectKeyword:0x007fd997641090 id: nil, project_id: 1671333, keyword_id: 39155, segmented_data: "{}"> 
[13] pry(#)> new_pr_keyword.save! 
=> true 
[14] pry(#)> new_pr_keyword.segmented_data.update({'new_data' => 'some_data'}) 
NoMethodError: undefined method `update' for "{}":String 
from (pry):14:in `block (3 levels) in <top (required)>' 

그러나 업데이트하기 전에 segmented_data 필드에 hash 값을 할당하면 update 메서드가 제대로 작동합니다.

예를

[15] pry(#)> new_pr_keyword.segmented_data = {'new_data' => 'some_data'} 
=> {"new_data"=>"some_data"} 
[16] pry(#)> new_pr_keyword.save! 
=> true 
[17] pry(#)> new_pr_keyword.segmented_data.update({'new_data_2' => 'some_data_2'}) 
=> {"new_data"=>"some_data", "new_data_2"=>"some_data_2"} 
[18] pry(#)> new_pr_keyword.save! 
=> true 

에 대한 질문은 방법 업데이트 한 후 바로이 분야에서 작동 할 수 있도록 방금 만든 객체 후, 해시 클래스가 아닌 문자열로 segmented_data의 기본 가치를 만드는 방법입니다.

+0

시도해 보셨습니까? http://stackoverflow.com/a/20746242/3884750? –

+0

예, 시도했지만 작동하지 않습니다 –

답변

12
이 여러 프로젝트에 나를 위해 일했다

:

add_column :project_keywords, :segmented_data, :jsonb, default: {} 

(안 문자열, 루비 해시) 나는 레일 3에서 작동하지 않는이 기억하는 것

하지만 괜찮해야한다 Rails 4.

+0

레일 4에서 정밀하게 - 그리고 레일 5에서도. –