Rails ActiveRecord存储中的动态属性

时间:2017-08-22 17:02:03

标签: ruby-on-rails ruby activerecord metaprogramming accessor

我有一个子模型,它应该能够通过ActiveRecord :: Store功能存储不同的属性。这些属性应由父模型确定。为此,父模型有一个列content_attributes,它将子项的属性存储为字符串数组(即['color', 'size', 'age'])。

要在父实例定义的所有属性的子实例中拥有访问器,我目前使用一种解决方法来映射所有可用父项的所有属性名称:

class child
  belongs_to :parent

  store :content, accessors: Parent.all_content_attributes, coder: JSON
  ...
end

实际上,我只想为不同父级的所有属性设置访问者。但是,在上面的示例中,子实例将获得一长串可分配的属性名称。如何替换Parent.all_content_attributes?猜猜我需要某种元编程吗?!

2 个答案:

答案 0 :(得分:3)

这是我的解决方案:

  store :content_store, coder: JSON

  after_initialize :add_accessors_for_content_attributes

  def add_accessors_for_content_attributes
    content_attributes.each do |attr_name|
      singleton_class.class_eval do
        store_accessor :content_store, attr_name
      end
    end
  end

  def content_attributes
    parent.content_attributes.map(&:name)
  end

答案 1 :(得分:1)

如果我理解正确,基本上你需要在实例化你的子对象时为父content_attributes执行数据库查找,然后根据该数据动态分配访问者。

这些方面的某些内容可以起作用 - How do I set an attr_accessor for a dynamic instance variable?

您可以尝试执行查找的after_initialize回调,然后在单例类上调用store_accessor