【问题标题】:How to set a default value for a JSON column/attribute in a Rails active record?如何为 Rails 活动记录中的 JSON 列/属性设置默认值?
【发布时间】:2019-11-21 03:17:48
【问题描述】:

我有这样的课程

#  json_column  :json
class MyClass < ActiveRecord::Base
  def name=(val)
    json_column[:name] = val
  end

  def name
    json_column[:name]
  end
end

当我加载数据时它工作正常,但如果我创建一个像MyClass.new(name: "foo") 这样的新实例,我的问题就开始了......

如果我让它保持原样,它会在name= 中抛出一个异常,因为 nil 不是哈希 :)。

如果我尝试在 after_initialize 方法中初始化 json_column

after_initialize { self.json_column ||= {}  }

它也不起作用,因为似乎在设置参数后调用了after_initialize

有人提示我应该如何解决这个问题? 提前谢谢你

【问题讨论】:

  • 为什么不在迁移中?您将节省大量时间,因为 Active Record 回调很麻烦。
  • 嗨@SebastianPalma,你的意思是默认值?不幸的是,无法将 default 值设置为 json 列
  • 你用的是什么数据库?
  • 我使用的是 MySQL 5.7

标签: ruby-on-rails json serialization


【解决方案1】:

您可以像这样使用 store 然后 after_initialize 回调来分配默认值


    store :json_column_name, accessors: [:key_name], coder: Hash # in mysql

    store_accessor :json_column_name, [:key_name] # in psql

    after_initialize :initialize_defaults, :if => :new_record?

    def initialize_defaults
        self.key_name = value
    end

【讨论】:

  • 非常感谢!它似乎有效......让我做一些其他测试,以便我标记为最佳答案
  • 工作就像一个魅力,非常感谢你。您知道是否有某种方法可以在 setter 中将符号转换为字符串?我回溯代码直到 github.com/rails/rails/blob/… ,但在此之后它变得超级复杂
猜你喜欢
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2022-11-06
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多