La mise en œuvre de Base Abstraite de la Classe du Modèle, les Rails de Chemin™

J'ai un Livre et Télécharger modèle que partagent de nombreux attributs, donc mon but est d'hériter de la commune attributs à partir d'un DownloadableResource modèle.
Eu un coup d'oeil à IST, mais je suis allé le abstrait modèle de base de la classe plutôt:

  • modèles:
    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
  • migrations:
    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

Après la migration, quand je crée un nouveau Livre le résultat est loin d'être prévu:

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

Quelqu'un peut-il s'il vous plaît faire la lumière sur la façon d'appliquer la Base Abstraite de la Classe du Modèle technique ActiveRecord modèles peuvent partager le code commun via l'héritage encore être persisté à différentes tables de base de données?

Une façon est d'une composition à la place de l'héritage. Quelques exemple: rails-bestpractices.com/posts/17-extract-into-module
Comme une note de côté, même si vous allez avec deux structurée de la même manière des tableaux, vous pouvez au moins garder votre migrations SEC en créant d'abord toutes les tables avec seulement leurs champs uniques et ensuite de faire quelque chose comme [:books, :downloads].each do |table| change_table table do |t| t.text :description # ... end end

OriginalL'auteur Marius Butuc | 2012-12-30