如何允许用户在Rails中定义任意数量的字段

时间:2016-09-05 10:09:03

标签: ruby-on-rails

我正在构建一个CMS,管理员必须能够定义不同类型的任意数字字段(文本,复选框等)。然后,用户可以填写这些字段并生成帖子。

如何在Rails中完成?我想这些“虚拟”属性的持久性将在数据库中的序列化属性中完成。但我不确定如何构建视图和控制器,或者应该定义字段的位置。

2 个答案:

答案 0 :(得分:5)

您所描述的内容称为Entity-Attribute-Value model。 MattW。提供了2种可能的解决方案,但您也可以使用其中一种实现此数据模式的宝石,而不是自己处理:

我之前没有使用过任何这些宝石,所以我无法建议哪一个最好。

RefineryCMS具有您需要的功能this extension。你可能想看一下想法。

还有类似的older question here on Stackoverflow

答案 1 :(得分:3)

一旦用户定义,它就永远不是列(字段),它始终是数据库中的行(实体) - 用户无法定义您的数据结构

这是两个想法。 (1)是更惯用的" Rails方式"。 (2)稍微复杂一点,但可能会将您绑定到您的特定DBMS。

(1)使用四个模型:Posts(n:1)PostTypes(1:n)PostFields(1:n)PostValues(n:1 { {1}}):

Posts

唯一的问题是,您只能将数据库中的值限制为单一类型,您可以执行多态关联并为以下内容创建不同的模型:boolean_post_values,:float_post_values等。

  1. 另一个解决方案可能是使用基于json的数据结构,即。即与上述相同,但不是create_table :post_types do |t| t.string :name t.text :description .... end create_table :post_fields do |t| t.references :post_type t.string :name t.integer :type t.boolean :required .... end create_table :posts do |t| t.references :post_type (... common fields for all posts, like user or timestamp) end create_table :post_values do |t| t.references :post t.references :post_field t.string :value .... end 而是将其保存在PostValues的一个字段中:

    Posts

  2. 这可能更容易,但json是postgres特定的数据类型(尽管您可以使用字符串并自行执行de /编码)。