2011-05-03 4 views
6

क्या किसी को पता है कि किसी उत्पाद के प्रमुख विशेषताओं (नाम, विवरण, पर्मलिंक, मेटा विवरण इत्यादि) के सेट में कोई नई विशेषता जोड़ना संभव है? विचार यह है कि मैं उत्पाद गुणों के माध्यम से बाद में जोड़ने के बजाय उत्पाद बनाते समय इन विशेषताओं को उपलब्ध करना चाहता हूं।स्प्री: किसी उत्पाद के प्रमुख विशेषताओं को कस्टमाइज़ करें

धन्यवाद।

उत्तर

9

माइग्रेशन के माध्यम से सीधे उत्पाद मॉडल में विशेषताओं को जोड़ने का सबसे आसान तरीका होगा। सजावट के उपयोग के माध्यम से मान्यताओं को जोड़ा जा सकता है, मॉडल को ओवरराइड करने के लिए स्प्री के भीतर पसंदीदा पैटर्न।

# in app/models/product_decorator.rb 
Product.class_eval do 
    validates :some_field, :presence => true 
end 

एक और विकल्प आपके विस्तारित फ़ील्ड के लिए द्वितीयक मॉडल बनाना होगा। शायद उत्पाद एक्सटेंशन

# in app/models/product_extension.rb 
class ProductExtension < ActiveRecord::Base 
    belongs_to :product 

    validates :some_field, :presence => true 
end 

# in app/models/product_decorator.rb 
Product.class_eval do 
    has_one :product_extension 
    accepts_nested_attributes_for :product_extension 
    delegate :some_field, :to => :product_extension 
end 

फिर आपके उत्पाद निर्माण फ़ॉर्म में आप इन फ़ील्ड को फ़ील्ड_for के साथ आपूर्ति कर सकते हैं। मुझे लगता है कि इसके साथ एक चेतावनी विस्तार से पहले उत्पादित उत्पाद मॉडल बनाने की आवश्यकता होगी। उत्पाद नियंत्रकों में कुछ अतिरिक्त तर्क के साथ आप संभवतः कार्रवाई कर सकते हैं।

0

स्प्री के लिए उत्पाद मॉडल (delegate_belongs_to के माध्यम से) का विस्तार करने के मेरे रास्ते:

#app/models/product_decorator.rb 
Spree::Product.class_eval do 
    has_one :product_extension 
    accepts_nested_attributes_for :product_extension, :allow_destroy => true 
    delegate_belongs_to :product_extension, :some_field 
    attr_accessible :some_field 
end 

#app/models/product_extension.rb 
class ProductExtension < ActiveRecord::Base 
    belongs_to :product, :class_name => 'Spree::Product' 
    attr_accessible :some_field 
end