diff --git a/app/blueprints/api/v1/summon_blueprint.rb b/app/blueprints/api/v1/summon_blueprint.rb index 31ec788..28404d5 100644 --- a/app/blueprints/api/v1/summon_blueprint.rb +++ b/app/blueprints/api/v1/summon_blueprint.rb @@ -16,6 +16,19 @@ module Api s.promotion_names end + field :series do |s| + if s.summon_series.present? + { + id: s.summon_series_id, + slug: s.summon_series.slug, + name: { + en: s.summon_series.name_en, + ja: s.summon_series.name_jp + } + } + end + end + field :uncap do |s| { flb: s.flb, diff --git a/app/models/summon.rb b/app/models/summon.rb index e5f111f..d2bf072 100644 --- a/app/models/summon.rb +++ b/app/models/summon.rb @@ -3,6 +3,8 @@ class Summon < ApplicationRecord include PgSearch::Model + belongs_to :summon_series, optional: true + multisearchable against: %i[name_en name_jp], additional_attributes: lambda { |summon| { @@ -65,4 +67,18 @@ class Summon < ApplicationRecord def promotion_names promotions.filter_map { |p| GranblueEnums::PROMOTIONS.key(p)&.to_s } end + + def series_slug + summon_series&.slug + end + + # Virtual attribute to set summon_series by ID or slug + # Supports both UUID and slug lookup for flexibility + def series=(value) + return self.summon_series = nil if value.blank? + + # Try to find by ID first, then by slug + found = SummonSeries.find_by(id: value) || SummonSeries.find_by(slug: value) + self.summon_series = found + end end