簡體   English   中英

多種產品類型購物車的Rails方式

[英]Rails way for multi product types shopping cart

我正在設計一個管理許多不同設備租賃的應用程序。 我想知道什么是為應用程序設計模型的最佳方法。 我的軟件必須管理許多不同類型的設備(包括數據類型),例如:

Speaker
  Make - String
  Model - String      
  Wattage - Integer
  Price - Decimal

Light
  Make - String
  Model - String      
  Wattage - Integer
  Price - Decimal

Microphone
  Make - String
  Model - String
  Use - Choice of: Instrumental, Vocal, Versatile
  Price - Decimal

Cable
  Length - Decimal
  Connector 1 - String
  Connector 2 - String
  Price - Decimal

Stand
  Type - Choice of: Microphone, Speaker
  Height - Decimal
  Boom - Boolean
  Price - Decimal

我考慮過設計的方式:

  • 每種類型產品的單獨模型,然后購物車中的多態關聯,以便它可以處理所有類型的設備。
  • 單個產品型號,具有適用於所有類型設備的字段,其類型字段可在使用產品時進行檢查。
  • 具有price屬性的產品模型然后每種類型的產品擴展該模型。

但是鐵路處理這些不同類型產品的最佳方式是什么?

Dynamic Attributes gem應該允許您自動執行此操作:

https://github.com/moiristo/dynamic_attributes

可能有更好的寶石可以滿足您的需求,但這是我發現的第一個寶石。

如果您使用Postgres作為數據庫,則可以使用hstore 有一些寶石可以與hstore一起使用。 如果您負擔得起,請訂閱railscast並觀看有關實施hstore的截屏視頻

Activerecord-postgres-hstore似乎是為此而去的寶石。

我個人會選擇單一型號產品和另一款名為ProductAttribute的型號。

在此表中,您將擁有name列和value列。

這樣,您不受架構的限制。 產品具有n個product_attributes ,動態命名。 您可以在管理部分中開發快捷方式,這樣如果您創建麥克風產品,它將自動在鏈接表中創建特定的屬性名稱。 你只需要輸入值。

這樣,您的應用程序就可以完全銷售具有任何數量屬性的任何類型的產品。 在3個月內管理員想要添加其他類型的產品時,無需再次編碼:)

編輯:當然,您有一個ProductType模型來管理您可以銷售的所有不同的產品類型。

另一種選擇是制作產品屬性表,並通過管理界面而不是低級代碼構建每種產品類型。 這樣您就不需要改變te應用程序來銷售新產品。

這個問題以前給許多ERP解決方案供應商帶來了麻煩。 基於我在一個這樣的供應商看到的東西,我建議你最優雅的解決方案就是這個。

您定義了4個模型:設備,設備類型,特征,選擇。

設備和特性之間存在多對多的關系,通過EquipmentType。 特征模型具有名為“value_type”的屬性,並且還具有您擁有的每個值類型的一個屬性(String,Integer,Decimal,Boolean)。 最后,在特征和選擇之間會有一對多的關系。

這實際上是該供應商實施的一個淡化版本,適合您的特定要求。 該供應商的實際實現實際上是在一個或兩個抽象層次上構建的,超出了我向您展示的內容,以使解決方案更具通用性。 但那些人因過度工程而聞名。

HTH。

第三種方法非常接近正確的方法。 您肯定希望將項目的所有通用參數(例如商店ID,以及,如您所述,價格)抽象到基本模型中,其他項目將擴展。 然后,正如您在第一個提議的解決方案中提到的那樣,您將在必要時使用:引用在其余項目類之間引用。

至於“類型”和“使用”,您可能最好使用與父模型的一對一關系。 然后,為每個模型存儲可能的字段類型列表(例如,對於Stand ,類似於possible_uses = "Microphone, Speaker" )。 最后,在實例化模型時執行服務器端驗證,以確保它是有效類型。 您還可以執行一些操作,以便確保MicrophoneSpeaker是您的代碼實際使用的唯一兩種“用途”。

完全不同但更干凈的方法是執行我在第一段中提到的所有內容,但繼續繼承到較低級別。 具體來說,讓Microphone擴展BaseItem ,為Microphone MakeModel參數,然后讓模型InstrumentalMicrophoneVocalMicrophone, and VersatileMicrophone extend the Microphone`類。 這將是最干凈的,並將允許完整的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM