Modyfikowanie modelu Product w Spree ecommerce

Krótkie pytanie do użytkowników Spree:

Czy modyfikowanie modelu Product, poprzez dodanie migracji oraz walidacji (poprzez product_decorator.rb) jest poprawnym rozwiązaniem dodawania dodatkowych atrybutów do modelu Product?

Potrzebuję kilku dodatkowych pól tekstowych (to niby mógłbym załatwić poprzez Properties), z walidacja ich długości (tego już Properties chyba nie potrafią), jak również pola typu datetime, boolean itd (czego też chyba wyklikać się nie da w prototypie produktu w żaden sposób).

O ile mi wiadomo i o ile udało mi się wyciągnąć od ludzi z RailsDoga na IRCu, to tak :slight_smile:

Dzięki, tak samo mi odpowiedziano na grupie dyskusyjnej Spree więc prawdą musi to być niechybnie.

Są dwa rozwiązania, zależy co potrzebujesz. Jeżeli jest to kilka dodatkowych pół, najprawdopodobniej chcesz żeby to był osobny model połączony 1:1
wtedy robisz tylko jedną klasę

class ProductExtraField < ActiveRecord::Base;
belongs_to :product

Tu walidacje oczywiście.

end

a w extension ładnie:

Product.has_one :product_extra_field

I masz po sprawie, upewnik się że nested attributes będą banglać, i tworzysz formularze łatwo, prosto i przyjemnie - jako bonus nie rozszerzasz i tak już spuchniętego modelu Product

Generalnie podejście _decorator sprawdza się jeżeli dodajesz głownie metody nie pola w bazie danych.

Dołącze się do wątku:

Chciałbym dodać walidację uniqueness dla pola :SKU dla Produktu (ale :SKU jest dostępne w modelu Variant)

Jak dodaję

Variant.class_eval do validates :sku, :presence => true, :uniqueness => true end
to wyrzuca mi błąd

[code]undefined method `price’ for nil:NilClass
Extracted source (around line #5):

2:
3: <% content_for :sidebar do %>
4:
5:

<%= @product.name %><%= @product.sku %>


6:

7:
8:
    [/code]

W jaki sposób utworzyłeś ten produkt? bez pełnego backtrace’a trudno powiedzieć, ale wszystko wskazuje na to że nie ma on master varianta. Co nie jest zupełnie związane z walidacją.

PRzy okazji, nie “podpinaj się” z niepowiązanymi pytaniami pod tematy - chyba że jest to specjalny temat w stylu Q&A. później ciężko się odróżnia odpowiedzi do jednego pytania od drugiego, oraz cięzko się sledzi i wyszukuje tego typu tematy.

Przepraszam za podpięcie, nie chciałem po prostu nowego wątku zakładać. Będę pamiętał na przyszłość.

Produkt dodaje normalnie, przez panel administratora. ( Przycisk New product )
I rzeczywiście nie ma master varianta właśnie przez ten błąd. Jak usunę tą moją walidację to produkt razem z master variantem jest poprawnie tworzony i wszystko jest ok.

No problem. Generalnie nie ma nic złego w zakładaniu nowych wątków o ile nie maja większego związku z istniejącym mają sens i nie są dupikatami. Twój post spełniał wszystkie kryteria.

A co do twojego błedu - należało by sprawdzić jak i kiedy jest zapisywany. Jest to błąd w Spree prawdopodobnie, dosyć łatwy niestety do popełnienia gdy korzysta się ze wzorca ActiveRecord, produkt nie powinien zostać stworzony bez master varianta, a master variant się nie zapisuje bo SKU z forumlarza powinno zostać mu przypisane przed próbą jego zapisu - najwyraźniej się to nie dzieje, musisz sam odkryć dlaczego i to poprawić. Powodzenia!