2017-04-22 34 views
1

我有一個與博客應用程序相關的軟件 - 數據庫架構/設計問題。假設我想爲用戶提供在頁面中添加節的功能。根據Web開發中的標準實踐,每個頁面部分可以有多個不同的組件。Rails:如何在博客部分中使用動態屬性

例如:

  • 帶段和一個圖像或兩個這樣的部件或部分
  • 具有四個圖像或一個廊或兩個畫廊
  • 與兩段OR
  • 的剖面的部
  • 與視頻和段落等A節

一種方法我可以採取是構建每種類型COMPON的ent類型,它的MVC組件,並在需要時使用它。但是我從設計的角度來看,如果我有1000個這樣的組件,我將有1000個活動記錄表。這不是有效的。

我感覺需要動態屬性生成或使用相同的表來存儲不同類型的組件,並根據類型屬性或工廠模式實現(我認爲這是一個很好的候選)動態地改變視圖。

如果您能幫助我解決這個設計問題,或者提出一些處理動態組件生成的其他方法,我將非常感激。

回答

1

通過將表格的可能配置作爲序列化哈希存儲在表格中,您可以獲得最大的靈活性。

假設您有一個sections表,其字段config的類型爲textSection模型將聲明serialize :config並自動將serialize/deserialize任何散列分配給section.config的實例。

config散列將具有您的部分佈局所需的屬性,例如,

section.config = { 
    components: [:paragraph, :image, :image, video], 
    # ... and any other such config settings you will need in your view to render this section as you want it 
} 

現在,也許你會實例化一個section模型,使其在放映視圖,並呈現部分的每個組成部分,你必須一個部分爲每個組件。這樣,您可以遍歷section.config[:components]並通過該名稱呈現部分內容,例如

section.config[:components].each do |component| 
    render partial: component, locals: { content: 'some content for the paragraph' } 
    # the above would render, for example, the 'paragraph' partial 
end 

有了這種性質的哈希值,可以讓用戶創建自己的部分定製他們想要的,選擇預定義的組件(您擁有的諧音),並在其中它們的任意組合增加的部分。

你甚至可以比上述方法更進一步,並創建一個Component模型,其中Section模型將與許多實例相關聯,即Section has_many :components。與此同時,SectionSectionconfig字段存儲了一個:components的數組,它將有許多Component模型,它們可以遍歷並訪問在渲染整個部分時可以使用的更豐富的一組屬性。這將使您能夠使用由Rails窗體幫助程序提供的嵌套字段,您可以在其中構建一個表單,供用戶用來創建複雜的部分並能夠對其進行重新排序,命名,添加樣式等(假設您添加了字段添加到用於存儲所有此配置數據的組件中)。通過這個最後的方法,您可以使用組件表來存儲節的每個組件的內容數據。

+1

非常感謝! :)我使用後一種方法創建一個組件(在我的情況下命名小部件具有多個字段和與每個字段相關聯的css字段,以及指定小部件的類型的類型字段:段落,圖像,視頻等)動態使用類型I向用戶提供他們可以填寫的表單,其中包含與窗口小部件類型相關的字段,以便僅生成必要的字段。最後,在視圖中,對於每個部分,我遍歷它的小部件並根據類型動態生成div。 –

+0

這真棒@SauravPrakash的方式去! – DiegoSalazar