Ho un e Scarica modello Libro che condividono molti attributi, quindi il mio obiettivo è quello di ereditare gli attributi comuni da un modello DownloadableResource.
dato un'occhiata a STI, ma sono andato via abstract base model class invece:implementazione astratta modello base di classe, il Rails Way ™
modelli:
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
migrazioni:
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
Dopo la migrazione, quando ho crea un nuovo libro il risultato è lontano prevede:
> Book.new
=> #<Book id: nil, cover_url: nil, authors: nil, created_at: nil, updated_at: nil>
Può qualcuno si prega di far luce su come implementare la tecnica di base astratto modello di classe in modo da modelli ActiveRecord possono condividere codice comune tramite inheritance ancora essere persistiti diverse tabelle di database?
Un modo è una composizione anziché un'ereditarietà. Alcuni esempi: http://rails-bestpractices.com/posts/17-extract-into-module – VadimAlekseev
Come nota a margine, anche se si utilizzano due tabelle strutturate in modo simile, è possibile almeno mantenere le migrazioni ASCIUTTE prima creando tutte tabelle con solo i loro campi unici e quindi facendo qualcosa come '[: libri,: download] .each do | table | tabella change_table do | t | t.text: descrizione # ... fine fine' – Janosch