8

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

我正在寻找类似Redmineacts_as_customizable插件的东西,它被打包为可在 rails 方式中使用的 gem,即

gem 'gemname'
rails g something
rails db:migrate

class Model < ActiveRecord::Base
  acts_as_something
end

这是Redmine 中使用的CustomFieldCustomValue类。

编辑:

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

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

取自这里,在本文中以不同的想法解决问题,但它们都有缺点。出于这个原因,我问是否已经在某些 gem 中解决了这个问题,而无需重新考虑整个问题。

4

4 回答 4

5

我不知道有什么宝石可以做到这一点,但serialize效果很好,而且它是内置的。您将获得由 JSON/YAML 支持的 NoSQL 式文档存储。

如果您允许用户创建自定义表单,您可以将嵌套数组等直接传递到属性中。但是,如果您需要验证结构,则只能靠自己。

于 2012-04-18T10:22:50.717 回答
3

从 Rails 3.2 开始,您可以使用store方法。只需在您的模型中包含以下内容:

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

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

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

于 2012-04-18T08:42:08.690 回答
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
于 2012-04-18T12:35:23.667 回答
0

我不知道 gem,但这可以通过创建一个名为 custom_fields 的表来实现,如果您想按数据类型限制字段,则该表具有名称列和可能的数据类型列。然后,您为所需的表和值创建一个自定义字段的连接表,并执行您想要的任何验证。

于 2012-04-13T16:51:31.490 回答