Module: Panda::Core::HasMetadata

Extended by:
ActiveSupport::Concern
Included in:
User
Defined in:
app/models/concerns/panda/core/has_metadata.rb

Overview

Concern for models with a JSONB metadata column.

Provides a DSL to declare typed metadata fields that auto-generate scopes, predicates, and virtual attribute setters.

class User < ApplicationRecord
include HasMetadata

 :internal, type: :boolean, filterable: true,
  label: "Visibility", default_scope: :external,
  filter_options: [["All Users", ""], ["Staff Users", "internal"], ["External Users", "external"]]
end

User.internal          # => scope
User.external          # => scope
user.internal?         # => true/false
user.mark_as_internal! # => saves
user.mark_as_external! # => saves
user.internal = "1"    # => virtual setter for forms

Instance Method Summary collapse

Instance Method Details

#metadata_value(key) ⇒ Object

-- Instance methods for generic metadata access --



145
146
147
# File 'app/models/concerns/panda/core/has_metadata.rb', line 145

def (key)
  (self[:metadata] || {})[key.to_s]
end

#remove_metadata(key) ⇒ Object



158
159
160
161
# File 'app/models/concerns/panda/core/has_metadata.rb', line 158

def (key)
  self. = (self[:metadata] || {}).except(key.to_s)
  save!
end

#set_metadata(key, value) ⇒ Object



149
150
151
152
# File 'app/models/concerns/panda/core/has_metadata.rb', line 149

def (key, value)
  self. = (self[:metadata] || {}).merge(key.to_s => value)
  save!
end

#set_metadata_attribute(key, value) ⇒ Object



154
155
156
# File 'app/models/concerns/panda/core/has_metadata.rb', line 154

def (key, value)
  self. = (self[:metadata] || {}).merge(key.to_s => value)
end