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

时间:2012-04-13 16:13:44

标签: ruby-on-rails activerecord ruby-on-rails-plugins dynamic-data

ruby​​ on rails是否有任何gem /插件可以在运行时在模型中定义自定义字段,而无需为每个不同的字段更改模型本身

我正在寻找类似Redmine acts_as_customizable插件的东西,它被打包成一个可用于轨道方式的宝石,即

gem 'gemname'
rails g something
rails db:migrate

class Model < ActiveRecord::Base
  acts_as_something
end

以下是Redmine中使用的CustomFieldCustomValue类。

编辑:

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

  

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

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

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

自rails 3.2起,您可以使用store方法。只需在您的模型中包含以下内容:

store :properties, accessors: [:property1, :property2, :property3...]

您只需更改一次模型(将properties字段添加到db表)。您可以稍后添加更多属性,而无需更改架构。

这种方法的工作方式是将属性hash序列化为YAML并将其保存到数据库中。它适用于大多数情况,但如果您希望稍后在db查询中使用这些值,则不适用。

答案 2 :(得分: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

答案 3 :(得分:0)

我不知道一个gem,但是如果你想用数据类型限制字段,可以创建一个名为custom_fields的表,其中包含一个名称列,可能还有一个数据类型列。 然后,为自定义字段和值创建自定义字段的连接表,并执行所需的任何验证。