私はSinatra(1.3.2)を学習しており、 DataMapper(1.2.0)をORMとして使用し、インメモリSQLite(1.3.6)DBを使用して開始することを選択しました。
2つのモデルBooks
とDownloads
がほとんどの属性を共有しているため、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:私は見ました
しかし、私はまだこの問題を抱えています。