2012-12-30 17 views
11

yüzden amacım bir DownloadableResource modelinden ortak özellikleri miras, birçok özellikleri paylaşan bir Kitap ve İndir modeli var.
STI bir göz vardı, ama bunun yerine abstract base model class tarafa gitti:Uygulama Özet Bankası Modeli Sınıf, Raylar Way ™

  • modeller:

    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 
    
  • göçler: Taşıma işleminden sonra

    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 
    

, ne zaman Yeni bir kitap oluşturmak için sonuç çok uzak beklenen:

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

birileri ActiveRecord modelleri henüz farklı veritabanı tablolarına kalıcı inheritance aracılığıyla ortak kod paylaşabilir böylece Özet Bankası Modeli Sınıf teknik nasıl biraz ışık tutmak misiniz?

+0

Tek yol, kalıtım yerine bir bileşimdir. Bazı örnek: http://rails-bestpractices.com/posts/17-extract-into-module – VadimAlekseev

+0

Bir yan not olarak, benzer şekilde yapılandırılmış iki tablodan geçseniz bile, en azından ilk önce her şeyi oluşturarak geçişlerinizi DRY yapabilirsiniz Sadece kendi alanları ile tablolar ve daha sonra 'gibi bir şey yapıyor [: kitap ,: downloads] .each do | table | change_table tablo do | t | t.text: description # ... end end' – Janosch

cevap

9

Bir modeli soyut olarak bildirerek aslında altta yatan bir tablonun olmadığını ve alt sınıflamaya izin vermek istediğinizi söylüyorsunuz. Bunun anlamı şudur:

  • Sen @Finbarr önce bahsedildiği gibi downloadable_resources

, bu da hem Book ve Download modelleri gerektiği anlamına gelir

  • Book.table_name baskılar books yerine downloadable_resources masa gerekmez tüm özellikleri tablolarında bulundurmak.

    Bu aslında o zaman ne işe yarar? Bence çok fazla değil. Doğrulamaları, kapsamları vb. Paylaşabilirsiniz, ancak özel modüller ekleyerek tüm bunları daha kolay bir şekilde gerçekleştirebilirsiniz.

    Sorununuzu çözmek için muhtemelen farklı bir yaklaşımla gideceğim. Kendini içerecek olan DownloadableContent adlı başka bir model yaratacağım. Doğrulamaları içerecek ve tablo tüm niteliklere sahip olacaktır. Son olarak, Book ve Download modellerinde DownloadableContent modeline ilişkin bir polimorfik has_one ilişkisi olacaktır.

    STI yaklaşımı ile devam edebilir, ancak genellikle tüm özel nitelikleri birlikte karıştırmayı sevmiyorum.

  • 5

    Bu durumda downloadable_resources tablosu olmamalıdır. Hem kitaplarınız hem de indirme masalarınız ihtiyaç duydukları tüm alanları beyan etmelidir.

    +2

    Neden? Bu davayı mirasa uygun kılan nedir? Ve miras almaya ne zaman karar vermeli, ne zaman değil? –