English version: simple_master_dataset_en.md
SimpleMaster ではデータの実体を Dataset が持ち、各 Master クラスごとに Table が対応します。
Loader が外部データを読み込み、Table がレコードと各種キャッシュを保持します。
Dataset
├─ Table (Weapon)
├─ Table (Armor)
└─ Table (Level)
loaderを使って各Tableをロードするcacheを保持し、クラス/インスタンスのキャッシュに利用するdiffによる差分上書きを提供する
loader = SimpleMaster::Loader::QueryLoader.new
dataset = SimpleMaster::Storage::Dataset.new(loader: loader)
dataset.load
SimpleMaster.use_dataset(dataset) do
# dataset を使った処理
endload: 全対象テーブルをロードし、キャッシュを更新reload:Tableの種類に応じて再ロード/アンロードを実行unload: テーブルとキャッシュをクリアduplicate(diff: nil): dataset を複製 (diff も継承)table(klass): 対象クラスのTableを取得
Loader から取得するデータの上にさらに変更を自動的に加えられる仕組みです。
dataset.diff に JSON/Hash を設定するとロード後に差分が適用されます。
Table.apply_diff が id_hash を更新し、差分レコードを上書きします。
dataset = SimpleMaster::Storage::Dataset.new
dataset.diff = {
"weapons" => {
"1" => { "name" => "Updated Name" },
"2" => nil
}
}
dataset.loadcache_read / cache_fetch / cache_write / cache_delete を用意しています。
外部参照用の軽量キャッシュに使えます。ただし、メモリに保存されるので、容量にご注意ください。
- 対象クラスのレコード配列 (
all) を保持 id_hash/grouped_hashを構築- クラス/インスタンスキャッシュを更新
- STI サブクラスのサブテーブルを保持
all: レコードの配列id_hash:id=> recordgrouped_hash:group_key=> grouped recordsclass_method_cache:cache_class_methodの結果method_cache:cache_methodの結果
STI を使うクラスでは、sub_table がサブクラスごとの Table を返します。
update_sub_tables が all からサブクラスを抽出して登録します。
Dataset読み込み時に全件をロードするloadのタイミングでall/id_hash/grouped_hashを構築- 基本的に中身は freeze されるので、Copy-on-Write が効きやすい
all/id_hash/grouped_hashを初回アクセス時に構築- 大規模データやオンデマンド参照で有効
dataset = SimpleMaster::Storage::Dataset.new(
table_class: SimpleMaster::Storage::OndemandTable
)- テスト向けの軽量テーブル
update/record_updatedによる差分更新を前提とする
dataset = SimpleMaster::Storage::Dataset.new(
table_class: SimpleMaster::Storage::TestTable
)Loader は read_raw と build_records を実装して使います。
既存の QueryLoader / MarshalLoader のほか、アプリケーションの要件に応じて Loader を作れます。
class JsonLoader < SimpleMaster::Loader
FIXTURE_DIR = Rails.root.join("fixtures/masters")
def read_raw(table)
File.read(FIXTURE_DIR.join("#{table.klass.table_name}.json"))
end
def build_records(klass, raw)
JSON.parse(raw).map { |attrs| klass.new(attrs) }
end
end