Module: AssociateJsonb::WithStoreAttribute::ClassMethods

Defined in:
lib/associate_jsonb/with_store_attribute.rb

Instance Method Summary collapse

Instance Method Details

#add_store_column_attribute_name(name, store, key, cast_opts) ⇒ Object



74
75
76
77
78
# File 'lib/associate_jsonb/with_store_attribute.rb', line 74

def add_store_column_attribute_name(name, store, key, cast_opts)
  store_column_attribute_tracker.synchronize do
    store_column_attribute_tracker.add_name(name, store, key, cast_opts)
  end
end

#arel_tableObject



51
52
53
# File 'lib/associate_jsonb/with_store_attribute.rb', line 51

def arel_table
  super.with_store_tracker(store_column_attribute_tracker)
end

#data_column_attribute(*args, **opts) ⇒ Object



97
98
99
# File 'lib/associate_jsonb/with_store_attribute.rb', line 97

def data_column_attribute(*args, **opts)
  store_column_attribute :data, *args, **opts
end

#inherited(child) ⇒ Object



46
47
48
49
# File 'lib/associate_jsonb/with_store_attribute.rb', line 46

def inherited(child)
  child.initialize_store_column_attribute_tracker
  super
end

#initialize_store_column_attribute_trackerObject



55
56
57
58
59
60
# File 'lib/associate_jsonb/with_store_attribute.rb', line 55

def initialize_store_column_attribute_tracker
  @store_column_attribute_tracker = const_set(:StoreColumnAttributeTracker, StoreColumnAttributeTracker.new)
  private_constant :StoreColumnAttributeTracker

  store_column_attribute_tracker
end

#is_store_column_attribute?(name) ⇒ Boolean

Returns:

  • (Boolean)


80
81
82
83
84
# File 'lib/associate_jsonb/with_store_attribute.rb', line 80

def is_store_column_attribute?(name)
  store_column_attribute_tracker.synchronize do
    store_column_attribute_tracker.has_name?(name)
  end
end

#set_store_column_attribute_values_on_initObject



86
87
88
89
90
91
92
93
94
95
# File 'lib/associate_jsonb/with_store_attribute.rb', line 86

def set_store_column_attribute_values_on_init
  lambda do
    self.class.store_column_attribute_names.each do |attr, opts|
      _write_attribute(attr, _read_attribute(opts[:store])[opts[:key]])
      clear_attribute_change(attr) if persisted?
    end
  rescue
    nil
  end
end

#store_column_attribute(store, attr, cast_type = ActiveRecord::Type::Value.new, sql_type: nil, key: nil, **attribute_opts) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/associate_jsonb/with_store_attribute.rb', line 101

def store_column_attribute(store, attr, cast_type = ActiveRecord::Type::Value.new, sql_type: nil, key: nil, **attribute_opts)
  store = store.to_s
  attr = attr.to_s
  key ||= attr
  key = key.to_s
  array = attribute_opts[:array]
  attribute attr, cast_type, **attribute_opts

  instance_eval <<~CODE, __FILE__, __LINE__ + 1
    add_store_column_attribute_name(attr, store, key, { sql_type: sql_type, type: cast_type, opts: attribute_opts })
  CODE

  include WithStoreAttribute::InstanceMethodsOnActivation.new(self, store, attr, key, array)
end

#store_column_attribute_namesObject



66
67
68
69
70
71
72
# File 'lib/associate_jsonb/with_store_attribute.rb', line 66

def store_column_attribute_names
  store_column_attribute_tracker.synchronize do
    current_store_col_names = {}
    current_store_col_names.merge!(super) if defined? super
    current_store_col_names.merge!(store_column_attribute_tracker.names_list)
  end
end

#store_column_attribute_trackerObject



62
63
64
# File 'lib/associate_jsonb/with_store_attribute.rb', line 62

def store_column_attribute_tracker
  @store_column_attribute_tracker ||= initialize_store_column_attribute_tracker
end