Class: Studio::Enumeral
- Inherits:
-
ApplicationRecord
- Object
- ApplicationRecord
- Studio::Enumeral
- Defined in:
- app/models/studio/enumeral.rb
Overview
A shared, DB-backed enumeration table for the whole ecosystem. Every “list of fixed, labeled, colored values” — Pokémon types (its first use), and later statuses, tiers, roles, … — is just rows in ONE studio_enumerals table, grouped by ‘category`. Each row is identity + presentation: a stable machine `key` (“fire”), a human `label` (“Fire”), a `color` hex (“#EE8130”), and a `position` for ordering within its category. `metadata` (jsonb) carries any category-specific extras off the columns.
Shipped by the gem like Studio::Link / Studio::EmailDelivery: the model lives here, the table lives in each consumer app (copy the reference migration into db/migrate). No behavior is attached — it is pure reference data the apps read, so a consumer adopts a new category by seeding rows, no code change.
Constant Summary collapse
- HEX =
/\A#(?:\h{3}|\h{6})\z/
Class Method Summary collapse
-
.available? ⇒ Boolean
True only when the table is actually migrated in this app’s DB, so a consumer that hasn’t installed the migration degrades to “empty” instead of crashing (mirrors Studio::EmailDelivery.available?).
-
.catalog(category) ⇒ Object
The ordered list of a category’s enumerals — the relation a view iterates (one query).
-
.color_for(category, key, fallback: nil) ⇒ Object
Just the color for a single (category, key), with an optional fallback when the key is unknown or the table isn’t installed yet.
-
.color_map(category) ⇒ Object
{ key => color } for a category in ONE query — the shape a view wants: build it once, then look up each cell with no extra queries (avoids an N+1 when rendering many rows, e.g. the /pokemon type badges).
-
.emoji_map(category) ⇒ Object
{ key => emoji } for a category in ONE query — the metadata sibling of color_map, for decorative glyphs kept in ‘metadata` rather than a column.
-
.lookup(category, key) ⇒ Object
The single enumeral for (category, key), or nil.
Instance Method Summary collapse
-
#emoji ⇒ Object
A decorative glyph for the value, kept in ‘metadata` (not a column) since it’s a presentation extra — e.g.
Class Method Details
.available? ⇒ Boolean
True only when the table is actually migrated in this app’s DB, so a consumer that hasn’t installed the migration degrades to “empty” instead of crashing (mirrors Studio::EmailDelivery.available?).
35 36 37 38 39 |
# File 'app/models/studio/enumeral.rb', line 35 def available? connection.data_source_exists?(table_name) rescue ActiveRecord::ActiveRecordError, NoMethodError false end |
.catalog(category) ⇒ Object
The ordered list of a category’s enumerals — the relation a view iterates (one query). Returns an empty relation when the table isn’t installed yet, so callers can ‘.each` safely pre-migration.
44 45 46 47 48 |
# File 'app/models/studio/enumeral.rb', line 44 def catalog(category) return none unless available? in_category(category).ordered end |
.color_for(category, key, fallback: nil) ⇒ Object
Just the color for a single (category, key), with an optional fallback when the key is unknown or the table isn’t installed yet.
66 67 68 69 70 |
# File 'app/models/studio/enumeral.rb', line 66 def color_for(category, key, fallback: nil) return fallback unless available? in_category(category).where(key: key.to_s).limit(1).pick(:color) || fallback end |
.color_map(category) ⇒ Object
{ key => color } for a category in ONE query — the shape a view wants: build it once, then look up each cell with no extra queries (avoids an N+1 when rendering many rows, e.g. the /pokemon type badges).
60 61 62 |
# File 'app/models/studio/enumeral.rb', line 60 def color_map(category) catalog(category).pluck(:key, :color).to_h end |
.emoji_map(category) ⇒ Object
{ key => emoji } for a category in ONE query — the metadata sibling of color_map, for decorative glyphs kept in ‘metadata` rather than a column.
74 75 76 |
# File 'app/models/studio/enumeral.rb', line 74 def emoji_map(category) catalog(category).pluck(:key, :metadata).to_h { |key, | [key, && ["emoji"]] } end |
.lookup(category, key) ⇒ Object
The single enumeral for (category, key), or nil.
51 52 53 54 55 |
# File 'app/models/studio/enumeral.rb', line 51 def lookup(category, key) return nil unless available? in_category(category).find_by(key: key.to_s) end |
Instance Method Details
#emoji ⇒ Object
A decorative glyph for the value, kept in ‘metadata` (not a column) since it’s a presentation extra — e.g. a Pokémon type’s emoji. Nil when unset.
81 82 83 |
# File 'app/models/studio/enumeral.rb', line 81 def emoji && ["emoji"] end |