From 2cb92046ebe697d6e17c78e968ec1bcf528487f0 Mon Sep 17 00:00:00 2001 From: David Gay Date: Thu, 3 Jun 2021 19:55:55 -0400 Subject: Only allow one food condition per character --- app/models/concerns/has_whatnot.rb | 6 +++++- app/models/state.rb | 14 +++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) (limited to 'app/models') diff --git a/app/models/concerns/has_whatnot.rb b/app/models/concerns/has_whatnot.rb index 289fe40..a0934ef 100644 --- a/app/models/concerns/has_whatnot.rb +++ b/app/models/concerns/has_whatnot.rb @@ -7,7 +7,11 @@ module HasWhatnot end def tags - whatnot[:tags] if whatnot + whatnot[:tags] ? whatnot[:tags] : [] + end + + def where_has_tag(tag) + where("whatnot->'tags' ? :tag", tag: tag) end end end diff --git a/app/models/state.rb b/app/models/state.rb index 27c8741..29b3f42 100644 --- a/app/models/state.rb +++ b/app/models/state.rb @@ -2,7 +2,7 @@ class State < ApplicationRecord belongs_to :character belongs_to :condition - after_create :destroy_duplicates + after_create :overwrite_old_states def expired? self.expires_at < Time.now @@ -17,7 +17,15 @@ class State < ApplicationRecord end private - def destroy_duplicates - self.character.states.where(condition: self.condition).where.not(id: self.id).destroy_all + def overwrite_old_states + # Don't allow duplicate conditions; just destroy the old one. + character.states.where(condition: condition).where.not(id: id).destroy_all + + # Only allow one food condition. Destroy the old one. + if condition.tags.include?("food") + character.states.each do |state| + state.destroy if state.id != id && state.condition.tags.include?("food") + end + end end end -- cgit v1.2.3