ActiveRecord ::存储具有从另一个表中提取的字段名的

时间:2019-03-11 15:22:06

标签: ruby-on-rails activerecord

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

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

但是这不起作用,因为该类被缓存了,因此也没有添加新的字段。通常,我希望使用Proc或lambda,但在这里不起作用。
是否有一个不依赖于添加宝石的简单解决方案?是否可以在不使用ActiveRecord Store和序列化列的情况下执行此操作,但是保留了执行验证和跟踪属性更改的功能?

1 个答案:

答案 0 :(得分:2)

尝试一下

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