我正在構建一個CMS,管理員必須能夠定義不同類型(文本,複選框等)的任意數字字段。用戶然後可以填寫這些字段並生成帖子。如何讓用戶在Rails中定義任意數量的字段
這怎麼能在Rails中完成?我想這些「虛擬」屬性的持久性將在數據庫中的序列化屬性中完成。但我不知道如何構建視圖和控制器,或者應該定義字段的位置。
我正在構建一個CMS,管理員必須能夠定義不同類型(文本,複選框等)的任意數字字段。用戶然後可以填寫這些字段並生成帖子。如何讓用戶在Rails中定義任意數量的字段
這怎麼能在Rails中完成?我想這些「虛擬」屬性的持久性將在數據庫中的序列化屬性中完成。但我不知道如何構建視圖和控制器,或者應該定義字段的位置。
您描述的內容稱爲Entity-Attribute-Value model。 MattW。提供了2個可能的解決方案,但你也可以用這些寶石實現的,而不是處理這個自己這個數據模式之一:
我沒有使用任何這些寶石之前,所以我不能建議哪一個最好。
RefineryCMS有this extension您需要的功能。你可能想看看想法。
只要是用戶定義的,它永遠不是一個列(字段),它始終是數據庫中的一行(實體) - 用戶無法定義數據結構。
這裏有兩個想法。 (1)是比較習慣的「Rails方式」。 (2)稍微不復雜,但可能會將您與您的特定DBMS聯繫起來。
(1)使用四種模式:Posts
(N:1)PostTypes
(1:N)PostFields
(1:N)PostValues
(N:1 Posts
):
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
唯一的問題是,你」重新限定爲在數據庫中的單一類型的值,則可以做一個多態型的關聯和用於創建不同的模型:boolean_post_values,:float_post_values等
另外一個解決方案可以是使用基於json的數據結構,即i。即與上述相同的,而是PostValues
只是它保存在一個領域Posts
:
create_table :posts do |t| t.references :post_type t.json :data ... end // ... no table :post_values
這可能是比較容易的,但JSON是Postgres特定的數據類型(雖然你可以使用字符串並自己做de /編碼)。