2012-11-06 77 views
5

通常創建/更改數據庫中的表我使用遷移(手動運行rake db:migrate),然後在我的代碼中使用ActiveRecord。這非常酷,因爲我不必擔心數據庫中的數據表示以及特定類型的數據庫(sqlserver,pg或其他)。rails動態創建數據表

但是現在客戶希望能夠自己創建「事物」,比如他開始銷售計算機,所以他想要一個界面,他可以動態地創建一個物體「計算機」,具有諸如「名稱,RAM,HD,...「。使用所有這些字段在db中創建一個單獨的表似乎很自然。但是我怎麼能在RoR中做到這一點,並保持有關ActiveRecord的所有這些好東西?

請建議。

回答

2

通常的辦法是反其道而行之:

  • 有對象類型的表
  • 對每個對象類型
  • 字段名稱的表有非常大的表的所有任何類型的每個對象的自定義屬性

這稱爲EAV(實體屬性值模型,請參閱http://en.wikipedia.org/wiki/Entity-attribute-value_model)。它的規模相當糟糕。

或者,您可以使用store文本列而不是大EAV表(請參閱http://api.rubyonrails.org/classes/ActiveRecord/Store.html),因此您不必進行那些典型的EAV的困難屬性檢索。您仍然需要在某處存儲「對象類型」定義,因此在構建表單和表格時可以使用期望的字段等。

這種方法的問題在於,您無法查詢(where/join/select)這些屬性,因爲它們不是列。有許多解決方案,即:

  • 不要做這些屬性過濾(MEH ...)
  • 有一個是能夠做到面搜索
  • 外部搜索服務器(如@Amar正確地說)使用文檔數據庫
  • 使用postgreSQL並使用hstore而不是簡單的序列化列。
+0

同意@rewritten,如果你想要更多的例子來看看「火車頭CMS」(http://locomotivecms.com/ ),他們做幾乎相同的事情,你在這裏試圖做:) – sameera207

+0

@ sameera207感謝您的示例鏈接(這是使用Mongo作爲數據庫)。如果你想看到一個有趣的EAV實現,請檢查SpreeCommerce:https://github.com/spree/spree – rewritten

+0

謝謝你會反對看看;) – sameera207

1

NoSQL數據庫(文檔數據庫Mongodb,CouchDB)可以最適合這種情況或使用redis。根據我的想法,您可以使用Vertical Table concept嘗試運行MySQL的Rails 2.x Demo of application。 你可以試用Mongodb,檢查是否需要。

+0

不知道爲什麼他們給你-1 :)日Thnx的答案 – xaxa