module Sequel::Plugins::StoreAccessors::ClassMethods

Public Instance Methods

store(column, *fields) click to toggle source

Setup a store

@param column [Symbol] jsonb column @param fields [Array<Symbol>] keys in json, which will be accessors @example

class User < Sequel::Model
   store :data, :first_name
end

user = User.create(first_name: "John")
user.first_name # => "John"
user.data # => {"first_name": "John"}
# File lib/sequel/plugins/store_accessors.rb, line 18
def store(column, *fields)
  include_accessors_module

  fields.each do |field|
    define_store_getter(column, field)
    define_store_setter(column, field)
  end
end

Private Instance Methods

define_store_getter(column, field) click to toggle source
# File lib/sequel/plugins/store_accessors.rb, line 35
def define_store_getter(column, field)
  @_store_accessors_module.module_eval do
    define_method(field) do
      send(column).to_h[field.to_s]
    end
  end
end
define_store_setter(column, field) click to toggle source
# File lib/sequel/plugins/store_accessors.rb, line 43
def define_store_setter(column, field)
  @_store_accessors_module.module_eval do
    define_method("#{field}=") do |value|
      send("#{column}=", send(column).to_h.merge(field.to_s => value))
    end
  end
end
include_accessors_module() click to toggle source
# File lib/sequel/plugins/store_accessors.rb, line 29
def include_accessors_module
  return if defined?(@_store_accessors_module)
  @_store_accessors_module = Module.new
  include @_store_accessors_module
end