ActiveRecord::Store 包含取自另一个表的字段名

the*_*ing 5 activerecord ruby-on-rails

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

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

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

Ant*_*yrd 3

尝试这个

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
Run Code Online (Sandbox Code Playgroud)