我有一个model ProjectKeyword,在第:segemnted_data列中使用jsonb数据类型

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::迁移[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)>'

但是,当我在更新之前将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

问题是,如何将分段_数据的默认值设置为哈希类而不是字符串,以便在刚刚创建对象之后,方法更新将直接在该字段上工作.

推荐答案

这在我的几个项目中起到了作用:

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

(不是字符串,而是ruby哈希)

我似乎记得这在Rails 3上不起作用,但在Rails 4中应该没问题.

Postgresql相关问答推荐

如何诊断字符编码问题

列不明确

在PostGreSQL中获取最近日期的项目

将整数(以毫秒为单位的epoch时间)转换为PrimitiveDateTime

PostgreSQL:动态SELECT查询

如何获得一起满足数量要求的物品? (WHILE 循环还是 CTE?)postgresql

在Power BI和Excel中将日期格式化为正确格式

在特定距离内创建点的唯一索引

是否可以短时间运行 VACUUM FULL 并获得一些好处?

如何使用有限的varchar在postgres中存储单词é

当我写 SELECT ~1;在 Postgresql 上它给了我 -2 结果.这是什么原因?它一直持续〜4和-5等

Postgresql JSONB 来了.现在用什么?Hstore?JSON?EAV?

遇到序列化失败的条件是什么?

org.postgresql.util.PSQLException:错误:relation "app_user" does not exist

避免 created_at 和 updated_at 由 sequelize 自动生成

如何缩小 pg_toast 表?

Postgres 中有多少表分区太多了?

SQLAlchemy 声明式:定义触发器和索引 (Postgres 9)

PostgreSQL:如果不存在则创建表 AS

Rails + Postgres fe_sendauth:no password supplied