gpt4 book ai didi

ruby-on-rails - ruby on rails jsonb 列默认值

转载 作者:行者123 更新时间:2023-11-29 11:11:32 26 4
gpt4 key购买 nike

我有一个模型 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::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)>'

但是当我在更新之前将 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 的默认值成为 Hash 类而不是 String,这样方法更新将在刚创建对象后立即在该字段上工作。

最佳答案

这对我来说在几个项目上都有效:

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

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

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

关于ruby-on-rails - ruby on rails jsonb 列默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37986984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com