用于模型中动态自定义字段的Rails gem/plugin

Fab*_*bio 8 activerecord ruby-on-rails dynamic-data ruby-on-rails-plugins

ruby on rails上是否有任何gem/plugin,它能够在运行时在模型中定义自定义字段,而无需为每个不同的字段更改模型本身.

我正在寻找像Redmine acts_as_customizable插件这样的东西,它被封装为可用于rails方式的gem,即

gem 'gemname'
rails g something
rails db:migrate

class Model < ActiveRecord::Base
  acts_as_something
end
Run Code Online (Sandbox Code Playgroud)

以下是Redmine中使用的CustomFieldCustomValue类.

编辑:

由于我的问题不明确,我添加了一个简短的用例,更好地解释了我的需求:

我希望用户能够设计自己的表单,并收集在这些表单上提交的数据.一个重要的决定是如何存储和访问这些自定义动态记录的设计.

这里开始,在本文中用不同的想法来解决问题,但它们都有缺点.出于这个原因,我问是否已经在一些宝石中找到了问题而无需重新考虑整个问题.

Pra*_*art 5

我不知道有这样做的宝石,但serialize效果很好而且它是内置的.您将获得由JSON/YAML支持的NoSQL-ish文档存储.

如果允许用户创建自定义表单,则可以将嵌套数组等直接传递给属性.但是,如果您需要验证结构,则可以自行完成.


lua*_*sus 3

恐怕在 ActiveRecoand 中(通常在标准关系数据库中)执行此操作可能会很棘手且复杂。看看http://mongoid.org/docs/documents/dynamic.html - 该机制使用 nosql 功能。

您还可以尝试以下技巧:

1/ 例如,使用数据库列中的自定义字段序列化哈希{ :foo => 'bar', :fiz => 'biz' }

2/从数据库加载记录后,进行一些元编程,并在记录的单例类上定义相应的方法,例如(假设自定义字段存储在custom_fields列中并序列化):

after_initialize :define_custom_methods
# ..or other the most convinient callback

def define_custom_methods
  # this trick will open record's singleton class
  singleton_class = (class << self; self; end)
  # iterate through custom values and define dynamic methods
  custom_fields.each_with_key do |key, value|
    singleton_class.send(:define_method, key) do
      value
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 我开始认为 NoSQL 数据库是解决此类问题的唯一解决方案。我从未使用过 mongoid,它是否也支持动态字段的 ActiveRecord/ActiveModel 内容(验证器、命名等)?PS:你的 AR 方法很好,但这样我就没有验证器和其他 AR 东西了。 (2认同)