考えられるのは、いくつかの基本情報を含むテーブル/エンティティを設計することです。テーブルなどを簡単に作成できます。ユーザーが編集できるページのデータストアスキーマを設計する(例:wikipedia/stackoverflowページ)
私はこのようなものを考えている:
type Tournament struct {
ID in64 `datastore:"-"`
MDContent []byte `datastore:",noindex"`
Name string
URL string
DateCreated int64
CreatedBy string
DateUpdated int64
UpdatedBy string
ApprovalStatus int64 // 0=to be decided, 1=approved, 2=rejected, 3=discontinued
ApprovalBy string
}
私の問題は、それを更新する方法を考え出すされています。 IDフィールドはURLパスとしても使用されます。エンティティのIDが7の場合、example.com/tournament/7に表示されます。
このようにすると、example.com/tournament/7 URLはnoとなるため、更新されたデータで新しいエンティティを作成して以前のエンティティでApprovalStatus = 3に設定する可能性は排除されます正しいIDを要求してください。
また、データストアIDの生成(URLに基づいて正しいエンティティを簡単に取得できるようにすること)を活用することは素晴らしいと思うので、独自のIDを作成することは嫌いです。私はリビジョンを追跡する新しいエンティティ/テーブルを作成することを検討しましたが、どれがどれぐらい効率的かはわかりませんので、専門家が助言を与えることができるようになることを期待していました。
@mkoprivaソリューションに関連する更新:あなたはこのようにそれを行うと
、それは私が考えるTournamentEditエンティティ構造体の内側TournamentIDフィールドを含める必要がありますか?
type TournamentEdit struct {
ID in64 `datastore:"-"`
TournamentID int64
MDContent []byte `datastore:",noindex"`
DateCreated int64
CreatedBy string
ApprovalStatus int64 // 0=to be decided, 1=approved, 2=rejected, 3=discontinued
ApprovalBy string
}
そして、取得機能は、次のようになります。
func (db *datastoreDB) GetTournamentByKeyID(ctx context.Context, keyID int64) (*Tournament, error) {
key := datastore.IDKey("Tournament", keyID, nil)
var tournamnet Tournament
err := db.client.Get(ctx, key, &tournament)
// err checking
tournament.ID = key.ID
var edits TournamentEdits
query := datastore.NewQuery("TournamentEdit")
query = query.Filter("TournamentID =", tournament.ID)
query = query.Filter("ApprovalStatus =", 1)
if _, err := db.client.GetAll(ctx, query, &edits); err != nil {
//err checking
}
tournament.Edits = edits // I guess this is wrong way to do it?
return &tournament, nil
}
が、この仕事はしませんか?
更新された質問をご覧ください。私はそれがこのようにすることができるということを意味すると思いますか?このシナリオでは、以前に承認されたエンティティが中止に設定されるため、ApprovalStatus = 1のエンティティが1つだけ存在する可能性があります(ApprovalStatus = 3) – fisker
「TournamentID」が実行される限り、リレーショナル'postgres'のようなデータベースですが、gaeの' datastore'とGoの関係をどのようにモデル化すればいいのか分かりませんが、もしあなたのアップデートの例があなたのために働くならば、おそらくそれはどうすればいいのでしょうか。 「ステータス」に関しては、新しいものを承認した後に最後に承認された編集を中止することは私には意味がある。 – mkopriva
偉大な、ありがとう、もう一度、もう一度:) – fisker