2014-06-08 30 views
5

Jak zaprojektować model dla tego samego produktu o innym kolorze, rozmiarze, ilości i cenie.Lepsza konstrukcja modelu produktu w sklepie internetowym

Oto mój obecny system model

Product 
* Name 
* Price 
* Color 
* Quantity 
* Size 

Jak pokazują ten sam produkt z różnych atrybutów w tym samym punkcie handlowym?

Zabiorę stronę na zakupy & F na przykład

Gdy użytkownik odwiedza tę stronę, oznacza to kupujesz COBBLE HILL TEE

myślę COBBLE HILL TEE z innego koloru i rozmiaru musi być inny różny instancja produktu w modelu produktu, prawda?

Podobnie jak trzy następujące przypadki należy do COBBLE HILL TEE ale są one różne przykład w modelu

`COBBLE HILL TEE`, `$39`, `Red`, `1`, `XL` 
`COBBLE HILL TEE`, `$39`, `White`, `3`, `L` 
`COBBLE HILL TEE`, `$37`, `White`, `5`, `S` 

więc nie powinno być kolumnę aby określić, które produkty powinny być zebrane do tego samego produktu, jak COBBLE HILL TEE, prawo ?

Czy powinienem dodać kolumnę o nazwie product_sn, kiedy te rekordy mają taką samą wartość w product_sn, powinny zostać zebrane na tej samej stronie zakupów?

Przepraszam za mój słaby angielski, aby opisać moje pytanie

enter image description here

+0

swoimi ' Obecny model schematu "jest doskonały. Zacznij z nim. – Pavan

Odpowiedz

6

Kocham modularity w oprogramowaniu, a także tworzyć modele odpowiednio. Myślę, że będziesz korzystać z tego pomysłu, więc wytłumaczę to dla ciebie:


modele

lubię trzymać modele, aby modele rozsuwane - tak można dodać na 1.000.000 przedmiotów i nadal działają we właściwy sposób.

Aby to zrobić, mamy "silosowe" bazy danych (nie jestem pewien, czy to jest właściwa terminologia), a następnie mam wokół nich "referencyjne" modele.

Baza danych/model "silos" zasadniczo przechowuje dane statyczne (takie jak products lub users). Referencyjna baza danych/modele w zasadzie udostępniają zakresy baz danych silo - np. Dodając options do products lub profile dla users.

W twoim przypadku, na pewno to zrobić:

#app/models/product.rb 
Class Product < ActiveRecord::Base 
    has_many :options, as: :optable do 
     def colours 
      where name: "colour" 
     end 
    end 
end 

#app/models/option.rb 
Class Options < ActiveRecord::Base 
    belongs_to :optable, polymorphic: true 
end 

schematów:

#products 
id | name | SKU | stock | etc | etc | created_at | updated_at 

#options 
id | optable_type | optable_id | name | value | created_at | updated_at 

-

stowarzyszenia

To polymorphic association (więc może korzystać z options Model z innych niepowiązanych modelach):

enter image description here

Oznacza to będziesz mógł zadzwonić:

@product = Product.find params[:id] 
@product.options #-> returns all `Option` records for `product` (`price`, `size`, `etc`) 

Jeśli ustawisz go prawo, powinieneś być w stanie to zrobić:

#config/routes.rb 
resources :products, only: :show #-> domain.com/products/14 

#app/controllers/products_controller.rb 
class ProductsController < ActiveRecord::Base 
    def show 
     @product = Product.find params[:id] 
    end 
end 

#app/views/products/show.html.erb 
<%= @product.name %> 
<% @product.options.each do |option| %> 
    <%= option.size %> 
    <%= option.price %> 
    <%= option.colour %> 
<% end %> 

Jeśli chciał wywołać product „s colour opcje, można wtedy zrobić:

@product = Product.find params[:id] 
@product.options.colours #-> will output all colours for the product 

Ostrzeżenia

Jednym z głównych zastrzeżeń z mojego kodu jest options Mam pod warunkiem nie jest skonstruowany w dowolny sposób. Jeśli chcesz mieć konkretny set opcji dla produktu (jakby size, colour, quantity dla konkretnego produktu, możesz użyć self-referential association w modelu Option, co mogę zrobić, jeśli chcesz