ruby on rails JSONB столбец значение по умолчанию
у меня есть модель ProjectKeyword, где я использую тип данных jsonb в столбце :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)>'
но когда я asign 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 хэш-классом, а не строкой, поэтому обновление метода будет работать сразу в этом поле после создания объекта.
1 ответов
это сработало для меня в нескольких проектах:
add_column :project_keywords, :segmented_data, :jsonb, default: {}
(Не строка, рубиновый хэш)
Я, кажется, помню, что это не работает на Rails 3, но это должно быть хорошо в Rails 4.