는 내가 열에 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의 기본 가치를 만드는 방법입니다.
시도해 보셨습니까? http://stackoverflow.com/a/20746242/3884750? –
예, 시도했지만 작동하지 않습니다 –