私は私の目標は、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を介して共通のコードを共有することができるように抽象ベースモデルクラスの技術を実装する方法にはいくつかの光を当てるていただけますか?
一方向は継承ではなく合成です。いくつかの例:http://rails-bestpractices.com/posts/17-extract-into-module – VadimAlekseev
2つの同様に構造化されたテーブルを使用する場合でも、少なくともすべての一意のフィールドだけを持つテーブルを作成してから '[:books、:downloads] .each do | table | change_tableテーブルdo | t | t.text:description #... end end' – Janosch