2012-12-30 17 views
11

मैं एक बुक और डाउनलोड मॉडल का हिस्सा है कि कई गुण है, इसलिए मेरा लक्ष्य एक DownloadableResource मॉडल से सामान्य विशेषताएं वारिस है।
STI पर एक नज़र था, लेकिन मैं abstract base model class रास्ता बजाय चला गया:कार्यान्वयन सार बेस मॉडल क्लास, रेल मार्ग ™

  • मॉडल:

    class DownloadableResource < ActiveRecord::Base 
        self.abstract_class = true 
    
        attr_accessible :title, :url, :description, :active, :position 
        validates :title, :url, :description, presence: true 
        scope :active, where(active: true).order(:position) 
    end 
    
    class Book < DownloadableResource 
        attr_accessible :cover_url, :authors 
        validates :cover_url, :authors, presence: true 
    end 
    
    class Download < DownloadableResource 
        attr_accessible :icon_url 
        validates :icon_url, presence: true 
    end 
    
  • माइग्रेशन:

    class CreateDownloadableResources < ActiveRecord::Migration 
        def change 
        create_table :downloadable_resources do |t| 
         t.string :title 
         t.string :url 
         t.text  :description 
         t.boolean :active,  default: false 
         t.integer :position 
         t.timestamps 
        end 
        end 
    end 
    
    class CreateBooks < ActiveRecord::Migration 
        def change 
        create_table :books do |t| 
         t.string :cover_url 
         t.string :authors 
         t.timestamps 
        end 
        end 
    end 
    
    class CreateDownloads < ActiveRecord::Migration 
        def change 
        create_table :downloads do |t| 
         t.string :icon_url 
         t.timestamps 
        end 
        end 
    end 
    

माइग्रेशन के बाद, जब मैं एक नई किताब बनाएं परिणाम नतीजा है उम्मीद:

> Book.new 
=> #<Book id: nil, cover_url: nil, authors: nil, created_at: nil, updated_at: nil> 

किसी कैसे सार बेस मॉडल क्लास तकनीक लागू करने के लिए तो ActiveRecord मॉडल inheritance के माध्यम से आम कोड साझा कर सकते हैं अभी तक विभिन्न डेटाबेस तालिकाओं को कायम किया पर कुछ प्रकाश डाला कृपया कर सकते हैं?

+0

एक तरीका विरासत की बजाय एक रचना है। कुछ उदाहरण: http://rails-bestpractices.com/posts/17-extract-into- मॉड्यूल – VadimAlekseev

+0

एक साइड नोट के रूप में, भले ही आप दो समान रूप से संरचित तालिकाओं के साथ जाएं, आप कम से कम अपने माइग्रेशन DRY को सभी बनाकर रख सकते हैं केवल अपने अद्वितीय क्षेत्रों के साथ तालिकाओं और फिर '[: किताबें, डाउनलोड] जैसे कुछ कर रहे हैं। सभी करें | तालिका | change_table तालिका do | t | t.text: विवरण # ... अंत अंत ' – Janosch

उत्तर

9

एक मॉडल को सार के रूप में घोषित करके आप वास्तव में कह रहे हैं कि कोई अंतर्निहित तालिका नहीं है और आप उप-वर्गीकरण की अनुमति देना चाहते हैं। इसका मतलब है कि:

  • आप downloadable_resources मेज की जरूरत नहीं है
  • Book.table_name प्रिंट books बजाय downloadable_resources

@Finbarr पहले से ही उल्लेख किया है, यह भी मतलब है कि दोनों Book और Download मॉडल की जरूरत है अपने टेबल में सभी गुणों के लिए।

इसके लिए वास्तव में क्या उपयोगी है? मेरी राय में ज्यादा नहीं। आप सत्यापन, स्कोप्स इत्यादि साझा कर सकते हैं लेकिन आप कस्टम मॉड्यूल सहित इसे और अधिक आसानी से प्राप्त कर सकते हैं।

अपनी समस्या का समाधान करने के लिए मैं शायद एक अलग दृष्टिकोण के साथ जाऊंगा। मैं DownloadableContent नामक एक और मॉडल तैयार करूंगा जो स्वयं निहित होगा। इसमें सत्यापन शामिल होंगे और तालिका में सभी गुण होंगे। और अंततः मॉडल Book और Download में DownloadableContent मॉडल के संबंध में एक polymorphic has_one होगा।

आप एसटीआई दृष्टिकोण के साथ जा सकते हैं लेकिन मुझे आम तौर पर सभी कस्टम विशेषताओं को एक साथ मिश्रण करना पसंद नहीं है।

5

इस मामले में downloadable_resources तालिका नहीं होनी चाहिए। आपकी किताबें और डाउनलोड टेबल दोनों को उन सभी फ़ील्ड घोषित करना चाहिए जिन्हें उन्हें चाहिए।

+2

क्यों? इस मामले को विरासत के लिए अनुपयुक्त क्यों बनाता है? और यह कैसे तय किया जाए कि यह विरासत के लायक है और जब यह नहीं है? –

संबंधित मुद्दे