首页 > 解决方案 > ActiveRecord::Store 带有取自另一个表的字段名

问题描述

假设我在 HR 系统中有两个模型,Person 和 Field。我想允许系统用户通过为其创建一个字段来向 Person 模型添加自定义属性。所以我的 Person 模型将包含类似的行

class Person < ActiveRecord::Base
  store :fields, accessors: Field.all.pluck(:name), coder: JSON
end

然而这不起作用,因为该类被缓存并且因此没有添加新字段。通常我会考虑使用 Proc 或 lambda,但这在这里行不通。
是否有一个不依赖于添加 gem 的简单解决方案来解决这个问题?我可以在不使用 ActiveRecord 存储和序列化列的情况下执行此操作,但我可以保留进行验证和跟踪属性更改的能力吗?

标签: ruby-on-railsactiverecord

解决方案


试试这个

class Person < ActiveRecord::Base
  store :fields, coder: JSON

  after_initialize :add_accessors_for_field_names

  def add_accessors_for_field_names
    field_names.each do |field_name|
      singleton_class.class_eval do
        store_accessor :fields, field_name
      end
    end
  end

  def field_names
    Field.all.pluck(:name)
  end
end

推荐阅读