Skip to content

Commit a7a16f1

Browse files
authored
Merge pull request #6 from aktsk/docs
Added some documents.
2 parents a678ded + 60d619c commit a7a16f1

10 files changed

Lines changed: 1038 additions & 0 deletions

README.ja.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,11 @@
1010
- **馴染みの関連 API で高速参照**: `belongs_to` / `has_many` 風のインターフェースを DB ではなくオンメモリ上で処理し、N+1 を気にしなくてよい速度で動作。
1111
- **COW フレンドリーで多プロセス共有**: レコードは freeze され、Copy-on-Write を活かしてフォークプロセス間でメモリを効率共有できる。
1212

13+
## ドキュメント
14+
- 導入ガイド: [English](docs/simple_master_guide_en.md) / [日本語](docs/simple_master_guide_ja.md)
15+
- カラム仕様: [English](docs/simple_master_columns_en.md) / [日本語](docs/simple_master_columns_ja.md)
16+
- Dataset / Table: [English](docs/simple_master_dataset_en.md) / [日本語](docs/simple_master_dataset_ja.md)
17+
- Association: [English](docs/simple_master_associations_en.md) / [日本語](docs/simple_master_associations_ja.md)
18+
1319
## ライセンス
1420
MIT ライセンスです。詳細は [LICENSE](LICENSE) を参照してください。

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,11 @@ In game development and other domains, configuration/definition datasets are oft
99
- **Familiar associations, very fast**: `belongs_to` / `has_many`-style API resolved in memory, fast enough that N+1 is rarely a concern.
1010
- **COW-friendly for multi-process**: records are frozen, making Copy-on-Write efficient when sharing memory across forked processes.
1111

12+
## Documentation
13+
- Getting Started Guide: [English](docs/simple_master_guide_en.md) / [日本語](docs/simple_master_guide_ja.md)
14+
- Columns: [English](docs/simple_master_columns_en.md) / [日本語](docs/simple_master_columns_ja.md)
15+
- Dataset / Table: [English](docs/simple_master_dataset_en.md) / [日本語](docs/simple_master_dataset_ja.md)
16+
- Associations: [English](docs/simple_master_associations_en.md) / [日本語](docs/simple_master_associations_ja.md)
17+
1218
## License
1319
MIT License. See [LICENSE](LICENSE) for details.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# SimpleMaster Associations (English)
2+
3+
> 日本語版: [simple_master_associations_ja.md](simple_master_associations_ja.md)
4+
5+
## Overview
6+
SimpleMaster provides `belongs_to`, `has_one`, `has_many`, and `has_many :through`.
7+
8+
## Definitions
9+
```ruby
10+
class Player < ApplicationRecord
11+
belongs_to :level, foreign_key: :lv, primary_key: :lv
12+
has_many :player_items
13+
end
14+
```
15+
16+
```ruby
17+
class Reward < ApplicationMaster
18+
belongs_to :enemy
19+
belongs_to :reward, polymorphic: true
20+
end
21+
```
22+
23+
The lookup path depends on whether the target is `SimpleMaster::Master`
24+
or `ActiveRecord::Base`.
25+
26+
- Master to Master: use `all_by` / `find_by`
27+
- These are fast, so values are fetched on each call. Cache in a variable if used often.
28+
- ActiveRecord: use `simple_master_connection`
29+
- `belongs_to_store` / `has_many_store` (RequestStore) caches per request.
30+
31+
## Common options
32+
### `class_name:`
33+
- Example: `belongs_to :reward, class_name: "Weapon"`
34+
- Explicitly sets the target class.
35+
36+
### `foreign_key:`
37+
- Example: `has_many :players, foreign_key: :lv`
38+
- Sets the foreign key column.
39+
40+
### `primary_key:`
41+
- Example: `belongs_to :level, primary_key: :lv`
42+
- Sets the target primary key (default is `:id`).
43+
44+
## Association types
45+
- `belongs_to` : `belongs_to :enemy`
46+
- `belongs_to (polymorphic)` : `belongs_to :reward, polymorphic: true`
47+
- Requires `def_column :reward_type, polymorphic_type: true`
48+
- `has_one` : `has_one :profile`
49+
- `has_many` : `has_many :players, foreign_key: :lv`
50+
- `has_many :through` : `has_many :items, through: :player_items`
51+
- `source:` can rename the target association
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# SimpleMaster Association 仕様 (日本語)
2+
3+
> English version: [simple_master_associations_en.md](simple_master_associations_en.md)
4+
5+
## 全体説明
6+
SimpleMaster の Association は `belongs_to` / `has_one` / `has_many` / `has_many :through` を提供します。
7+
8+
## 定義方法
9+
```ruby
10+
class Player < ApplicationRecord
11+
belongs_to :level, foreign_key: :lv, primary_key: :lv
12+
has_many :player_items
13+
end
14+
```
15+
16+
```ruby
17+
class Reward < ApplicationMaster
18+
belongs_to :enemy
19+
belongs_to :reward, polymorphic: true
20+
end
21+
```
22+
23+
対象が `SimpleMaster::Master``ActiveRecord::Base` かで参照方法が変わります。
24+
25+
- Master 同士: `all_by` / `find_by` を使った参照
26+
- 取得が高速なため、都度引き直しとなります。利用時に呼ぶ回数多いなら、変数に格納してください。
27+
- ActiveRecord: `simple_master_connection` で DB 参照
28+
- `belongs_to_store` / `has_many_store` (RequestStore) に保持されるため、リクエストごとにキャッシュが効きます。
29+
30+
## 共通オプション
31+
### `class_name:`
32+
- 例: `belongs_to :reward, class_name: "Weapon"`
33+
- 明示的に参照先クラスを指定します。
34+
35+
### `foreign_key:`
36+
- 例: `has_many :players, foreign_key: :lv`
37+
- 外部キー名を指定します。
38+
39+
### `primary_key:`
40+
- 例: `belongs_to :level, primary_key: :lv`
41+
- 参照先のキーを指定します(デフォルトは `:id`)。
42+
43+
## Association 種別
44+
- `belongs_to` : `belongs_to :enemy`
45+
- `belongs_to (polymorphic)` : `belongs_to :reward, polymorphic: true`
46+
- 前提: `def_column :reward_type, polymorphic_type: true`
47+
- `has_one` : `has_one :profile`
48+
- `has_many` : `has_many :players, foreign_key: :lv`
49+
- `has_many :through` : `has_many :items, through: :player_items`
50+
- `source:` を指定すると参照先の名前を変更できます。

docs/simple_master_columns_en.md

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
# SimpleMaster Columns (English)
2+
3+
> 日本語版: [simple_master_columns_ja.md](simple_master_columns_ja.md)
4+
5+
## Overview
6+
SimpleMaster columns are defined with `def_column`. At load time, type conversion,
7+
cache helpers, and accessor methods are generated.
8+
The behavior depends on `type` and DSL options.
9+
10+
```ruby
11+
class Weapon < ApplicationMaster
12+
def_column :id
13+
def_column :name, type: :string
14+
def_column :attack, type: :float
15+
def_column :rarity
16+
17+
enum :rarity, { common: 0, rare: 1, epic: 2 }
18+
end
19+
```
20+
21+
## Common options
22+
### `type:`
23+
- Example: `def_column :attack, type: :float`
24+
- See the column type list below.
25+
26+
### `group_key:`
27+
- Example: `def_column :lv, type: :integer, group_key: true`
28+
- You can also use `group_key :lv`.
29+
30+
### `db_column_name:`
31+
- Use when the DB column name differs.
32+
- Example: `def_column :start_at, type: :time, db_column_name: :start_time`
33+
34+
### `globalize:`
35+
- Adds locale-aware values using `I18n.locale`.
36+
- Example: `def_column :name, globalize: true`
37+
- You can also use `globalize :name`.
38+
- Translation values live in `@_globalized_name` like `{ en: "Storm Edge", ja: "..." }`.
39+
- Not supported on `id` / `enum` / `bitmask` / `sti` / `polymorphic_type`.
40+
- Cannot be used with `group_key`.
41+
42+
## Column types
43+
44+
### id (IdColumn)
45+
**Usage**
46+
```ruby
47+
def_column :id
48+
```
49+
**Behavior**
50+
- Converts to `to_i` on assignment.
51+
- In tests, updates `id_hash` when changed.
52+
53+
### integer
54+
**Usage**
55+
```ruby
56+
def_column :lv, type: :integer
57+
```
58+
**Behavior**
59+
- Converts to `to_i` on assignment (empty string becomes `nil`).
60+
61+
### float
62+
**Usage**
63+
```ruby
64+
def_column :attack, type: :float
65+
```
66+
**Behavior**
67+
- Converts to `to_f` on assignment (empty string becomes `nil`).
68+
69+
### string
70+
**Usage**
71+
```ruby
72+
def_column :name, type: :string
73+
```
74+
**Behavior**
75+
- Converts to `to_s` on assignment.
76+
- Values are cached to reuse identical objects (`object_cache`).
77+
78+
### symbol
79+
**Usage**
80+
```ruby
81+
def_column :kind, type: :symbol
82+
```
83+
**Behavior**
84+
- Converts to `to_s` + `to_sym` on assignment.
85+
- SQL/CSV output uses a string.
86+
87+
### boolean
88+
**Usage**
89+
```ruby
90+
def_column :is_boss, type: :boolean
91+
```
92+
**Behavior**
93+
- Integers use 0/1, strings accept "true" or "1".
94+
- Adds a `name?` predicate.
95+
- SQL/CSV output is 0/1.
96+
97+
### json
98+
**Usage**
99+
```ruby
100+
def_column :info, type: :json
101+
```
102+
**Options**
103+
- `symbolize_names: true` converts JSON keys to symbols.
104+
105+
**Behavior**
106+
- Parses string values with `JSON.parse`.
107+
- SQL/CSV output uses `JSON.generate`.
108+
- Non-string assignments are not transformed by `symbolize_names`.
109+
110+
### time
111+
**Usage**
112+
```ruby
113+
def_column :start_at, type: :time
114+
```
115+
**Options**
116+
- `db_type: :time` outputs `HH:MM:SS` only.
117+
118+
**Behavior**
119+
- Parses strings with `Date._parse` into `Time`.
120+
- Sub-seconds are truncated.
121+
122+
### enum
123+
**Usage**
124+
```ruby
125+
def_column :rarity, enum: { common: 0, rare: 1, epic: 2 }
126+
# or
127+
def_column :rarity
128+
enum :rarity, { common: 0, rare: 1, epic: 2 }
129+
```
130+
**Options**
131+
- `prefix`, `suffix` add a prefix/suffix to predicates.
132+
- `prefix: true` => `rarity_common?`
133+
- `suffix: :rarity` => `common_rarity?`
134+
135+
**Behavior**
136+
- Values are stored as symbols.
137+
- Adds `rarities` and `rarity_before_type_cast`.
138+
- Predicate methods (e.g. `common?`) are generated.
139+
140+
### bitmask
141+
**Usage**
142+
```ruby
143+
def_column :flags, type: :integer
144+
bitmask :flags, as: [:tradeable, :soulbound, :limited]
145+
```
146+
**Behavior**
147+
- Accepts array/symbol/integer and converts to bit integer.
148+
- `flags` returns an array of symbols.
149+
- Adds `flags_value` / `flags_value=` for raw integer bits.
150+
151+
### sti (STI type column)
152+
**Usage**
153+
```ruby
154+
def_column :type, sti: true
155+
```
156+
**Behavior**
157+
- Converts `type` to a string.
158+
- Defines `sti_base_class` and `sti_column`.
159+
- Loader should resolve classes by `type`.
160+
161+
### polymorphic_type
162+
**Usage**
163+
```ruby
164+
def_column :reward_type, polymorphic_type: true
165+
```
166+
**Behavior**
167+
- Used for `belongs_to polymorphic` type columns.
168+
- Stores a class name string and sets `reward_type_class`.
169+
- Empty strings become `nil`.
170+
171+
## Custom column types
172+
Define custom columns by subclassing `SimpleMaster::Master::Column`.
173+
If the class name ends with `Column`, the `type` is auto-registered.
174+
175+
```ruby
176+
class MoneyColumn < SimpleMaster::Master::Column
177+
private
178+
179+
def code_for_conversion
180+
<<-RUBY
181+
value = value&.to_i
182+
RUBY
183+
end
184+
185+
def code_for_sql_value
186+
<<-RUBY
187+
#{name}
188+
RUBY
189+
end
190+
end
191+
192+
class Product < ApplicationMaster
193+
def_column :price, type: :money
194+
end
195+
```
196+
197+
- Ensure the file is loaded before use.
198+
- Override `init` if you need custom methods.
199+
- See [lib/simple_master/master/column.rb](lib/simple_master/master/column.rb).

0 commit comments

Comments
 (0)