我正在构建一个CMS,管理员必须能够定义不同类型的任意数字字段(文本,复选框等)。然后,用户可以填写这些字段并生成帖子。
如何在Rails中完成?我想这些“虚拟”属性的持久性将在数据库中的序列化属性中完成。但我不确定如何构建视图和控制器,或者应该定义字段的位置。
答案 0 :(得分:5)
您所描述的内容称为Entity-Attribute-Value model。 MattW。提供了2种可能的解决方案,但您也可以使用其中一种实现此数据模式的宝石,而不是自己处理:
我之前没有使用过任何这些宝石,所以我无法建议哪一个最好。
RefineryCMS具有您需要的功能this extension。你可能想看一下想法。
答案 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等。
另一个解决方案可能是使用基于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
这可能更容易,但json是postgres特定的数据类型(尽管您可以使用字符串并自行执行de /编码)。