15

多くの属性を共有するBookおよびDownloadモデルがあるため、私の目標はDownloadableResourceモデルから共通の属性を継承することです。STI
を見ましたが、代わりに抽象基本モデルクラスの方法を使用しました。

  • モデル:

    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モデルが継承を介して共通のコードを共有しながら、異なるデータベーステーブルに永続化できるように、Abstract Base Model Classテクニックを実装する方法に光を当てることができますか?

4

2 に答える 2

14

モデルを抽象として宣言することにより、実際には基になるテーブルがなく、サブクラス化を許可したいと言っています。つまり、次のことを意味します。

  • downloadable_resourcesテーブルはいらない
  • Book.table_name のbooks代わりに印刷されますdownloadable_resources

@Finbarr が既に述べたように、これはBookDownloadモデルの両方がテーブルにすべての属性を持つ必要があることも意味します。

これは実際に何に役立ちますか?私の意見では、大したことではありません。検証、スコープなどを共有できますが、カスタム モジュールを含めることで、これらすべてをより簡単に実現できます。

あなたの問題を解決するには、おそらく別のアプローチをとります。DownloadableContent私は自己完結型と呼ばれる別のモデルを作成します。これには検証が含まれ、テーブルにはすべての属性が含まれます。そして最後にモデル化し、モデルBookDownloadのポリモーフィックhas_oneな関係を持ちDownloadableContentます。

STI のアプローチを採用することもできますが、私は通常、すべてのカスタム属性を混ぜ合わせるのは好きではありません。

于 2012-12-30T14:28:57.410 に答える
5

downloadable_resourcesこの場合、テーブルがあってはなりません。ブック テーブルとダウンロード テーブルの両方で、必要なすべてのフィールドを宣言する必要があります。

于 2012-12-30T06:48:22.873 に答える