0

私はSinatra(1.3.2)を学習しており、 DataMapper(1.2.0)をORMとして使用し、インメモリSQLite(1.3.6)DBを使用して開始することを選択しました。
2つのモデルBooksDownloadsがほとんどの属性を共有しているため、DataMapperでSTI(単一テーブル継承)のモデルを宣言することを検討しました。ドキュメントを読むと、 Types::Discriminatorのおかげでこれは簡単なことのようです。

私はすべての一般的なものを次のように抽象化しましたDownloadableResource

class DownloadableResource
  include DataMapper::Resource

  property :id,           Serial
  property :created_at,   DateTime
  property :modified_at,  DateTime
  property :active,       Boolean,  default: true

  property :position,     Integer

  property :title,        String,   required: true
  property :url,          URI,      required: true
  property :description,  Text,     required: true

  property :type,         Discriminator
end

に従って、拡張する必要があるものを指定するのと同じくらい簡単だと思いました。

class Book < DownloadableResource
  property :cover_url,    URI
  property :authors,      String,   required: true, length: 255
end

class Download < DownloadableResource
  property :icon_url,     URI
end

しかし、これは私に次のエラーを与えていました:

DataObjects :: SyntaxError:重複列名:id(コード:1、sql状態:、クエリ:ALTER TABLE " downloadable_resources " ADD COLUMN "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT、uri:sqlite3 :: memory:?scheme = sqlite&user = &password =&host =&port =&query =&fragment =&adapter = sqlite3&path =:memory :)

IDを削除しているときに、別の(明らかな)エラーが発生しました:

DataMapper :: IncompleteModelError:DownloadableResourceには、有効であるためのキーが必要です

include DataMapper::Resourceとの両方に追加するBookことでこれを回避し、Download有効Bookにするためにキーが必要になりました。これは次のようになります。

class Book < DownloadableResource
  include DataMapper::Resource

  property :id,           Serial

  property :cover_url,    URI
  property :authors,      String,   required: true, length: 255
end

同じことが当てはまりますがDownload、問題は次のとおりです。

DataObjects :: SyntaxError:重複列名:id(コード:1、sql状態:、クエリ:ALTER TABLE " books " ADD COLUMN "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT、uri:sqlite3 :: memory:?scheme = sqlite&user = &password =&host =&port =&query =&fragment =&adapter = sqlite3&path =:memory :)

私が輪になっていくように感じ始めましたが、DataMapperで単一テーブル継承を実装する適切な方法は何ですか?


PS:私は見ました

しかし、私はまだこの問題を抱えています。

4

1 に答える 1

1

私はこのアプローチをお勧めします:

module DownloadableResource

  def self.included base
    base.class_eval do
      include DataMapper::Resource

      property :created_at,   DateTime
      property :modified_at,  DateTime
      property :active,       base::Boolean,  default: true

      property :position,     Integer

      property :title,        String,   required: true
      property :url,          base::URI,      required: true
      property :description,  base::Text,     required: true

      property :type,         base::Discriminator
    end
  end
end

class Book
  include DownloadableResource
  property :id, Serial
  # other properties
end

class Download
  include DownloadableResource
  property :id, Serial
  # other properties
end
于 2012-12-13T16:33:36.313 に答える