Ich habe ein Buch und herunterladen Modell, das viele Eigenschaften teilen, so ist es mein Ziel, die gemeinsamen Attribute von einem DownloadableResource Modell zu erben.
hatte einen Blick auf STI, aber ich ging die abstract base model class Art und Weise statt:Implementieren abstrakte Basismodellklasse, die Rails Way ™
Modelle:
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
Migrationen:
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
Nach der Migration, wenn ich Erstellen Sie ein neues Buch, das Ergebnis ist weit von erwartet:
> Book.new
=> #<Book id: nil, cover_url: nil, authors: nil, created_at: nil, updated_at: nil>
Kann jemand Schuppen bitte etwas Licht auf, wie die abstrakte Basis Model-Klasse Technik zu implementieren, so Active Modelle gemeinsamen Code über inheritance teilen können noch auf verschiedene Datenbanktabellen beibehalten werden?
Ein Weg ist eine Zusammensetzung anstelle von Vererbung. Ein paar Beispiele: http://rails-bestpractices.com/posts/17-extract-into-module – VadimAlekseev
Als eine Randnotiz, auch wenn Sie mit zwei ähnlich strukturierten Tabellen gehen, können Sie zumindest Ihre Migrationen DRY halten, indem Sie zuerst alle erstellen Tabellen mit nur ihren eindeutigen Feldern und dann so etwas wie '[: Bücher,: Downloads] .each do | table | change_table-Tabelle do | t | t.text: Beschreibung # ... Ende Ende' – Janosch