2016-06-23 14 views
6

मैं :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 उदाहरण बनाने को एक मॉडल ProjectKeyword जहाँ मैं कॉलम में jsonb डेटाप्रकार का उपयोग करें 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)>' 

लेकिन जब मैं hash फ़ील्ड segmented_data को अद्यतन करने से पहले 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 काम नहीं कर पा रहे हैं, लेकिन यह में ठीक किया जाना चाहिए रेल 4.

+0

रेल 4 में ठीक है - और रेल 5 में भी। –