Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 模型中动态自定义字段的Rails gem/插件_Ruby On Rails_Activerecord_Ruby On Rails Plugins_Dynamic Data - Fatal编程技术网

Ruby on rails 模型中动态自定义字段的Rails gem/插件

Ruby on rails 模型中动态自定义字段的Rails gem/插件,ruby-on-rails,activerecord,ruby-on-rails-plugins,dynamic-data,Ruby On Rails,Activerecord,Ruby On Rails Plugins,Dynamic Data,rubyonrails是否有任何gem/插件可以在运行时在模型中定义自定义字段,而无需为每个不同的字段更改模型本身 我正在寻找像Redmine插件这样的东西,它被打包成可以在rails中使用的gem,即 gem 'gemname' rails g something rails db:migrate class Model < ActiveRecord::Base acts_as_something end gem'gemname' 什么东西 rails数据库:迁移 类模型'bar

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

我正在寻找像Redmine插件这样的东西,它被打包成可以在rails中使用的gem,即

gem 'gemname'
rails g something
rails db:migrate

class Model < ActiveRecord::Base
  acts_as_something
end
gem'gemname'
什么东西
rails数据库:迁移
类模型
以下是Redmine中使用的名称和类

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

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


从中可以看出,本文对这个问题有不同的看法,但都有缺点。出于这个原因,我想问的是,在一些gem中是否已经解决了这个问题,而不需要重新思考整个问题。

我不知道gem,但如果您想按数据类型限制字段,可以创建一个名为custom_fields的表,其中包含一个name列,也可能包含一个datatype列,这可以通过创建一个名为custom_fields的表来实现。
然后,为自定义字段创建一个连接表,将其连接到所需的表和值,并执行所需的任何验证。

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

store :properties, accessors: [:property1, :property2, :property3...]
您只需更改一次模型(将
属性
字段添加到db表中)。以后可以添加更多属性,而无需更改架构


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

我不知道有哪种gem可以做到这一点,但
序列化
非常有效,而且它是内置的。您将获得一个由JSON/YAML支持的NoSQL ish文档存储


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

恐怕在ActiveRecand(通常在标准关系数据库中)中进行验证可能会很棘手和复杂。看看-这个机制使用的是nosql特性

您也可以尝试以下技巧:

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

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

在\u初始化之后:定义\u自定义\u方法
#…或其他最方便的回调
定义自定义方法
#这个把戏将开启record的单人课

单例_类=(类是的,我知道这一点,但我更喜欢已经构建的、已经测试过的和已知的东西。Redmine可以作为一个选项,但不能按原样使用,因为它不是作为gem提取的,而是内置到Redmine中。我还想你可以使用表中的一列作为键/值存储,它不会被搜索。)我也知道这一点,但它不允许在运行时进行更改,这是一项要求。为了添加字段,我需要编辑模型代码,因此它不适合我的需要。AR store不适合我的需要,我希望应用程序最终用户能够为给定模型定义其他字段。我已经用mor更新了这个问题e详细信息。哦,我不知道你希望用户能够定义自定义属性。我不知道有没有gem,但我会使用REDIS来存储这些数据。它只需要几行代码就可以实现你想要的行为。我开始认为NoSQL db是解决这类问题的唯一解决方案。我从来没有使用过mongoid,是吗它支持ActiveRecord/ActiveModel(验证器、命名等)对于动态字段也是如此?另外,您的AR方法很好,但这样我就没有验证器和其他AR好东西。Mongoid对验证有很好的支持,请看,我不确定您是否可以为动态字段添加验证。您可能会在这里找到一些线索:如果您使用Postgres,您可以使用hstore来实现此()。这有点像“in column schema less thingy”@kandadboggu在我的例子中是MySQL,但AR插件通常不依赖于特定的RDBMS。Postgres数据库支持名为
hstore
的数据类型。观看此屏幕广播:()这是多租户还是多实例应用程序?换句话说,您是否计划为所有客户端提供一个db,或者每个客户端都有自己的db实例?@GregDan我从链接文章中选取了这个用例,因为它用一个具体的例子解释了我要做的事情。在我的情况下,只有一个数据库。@Fabio如果有许多db,我会建议为自定义字段添加新列。当DB架构更改时,Rails不会重新加载AR类,但这应该是可以修复的。带有序列化哈希的解决方案闻起来像
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