Class: FrozenRecord::Base
- Inherits:
-
Object
- Object
- FrozenRecord::Base
show all
- Extended by:
- ActiveModel::Naming, ActiveSupport::DescendantsTracker
- Includes:
- ActiveModel::AttributeMethods, ActiveModel::Conversion, ActiveModel::Serializers::JSON, ActiveModel::Serializers::Xml
- Defined in:
- lib/frozen_record/base.rb,
lib/frozen_record/serialization.rb
Defined Under Namespace
Classes: ThreadSafeStorage
Constant Summary
collapse
- FIND_BY_PATTERN =
/\Afind_by_(\w+)(!?)/
- FALSY_VALUES =
[false, nil, 0, -''].to_set
Class Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(attrs = {}) ⇒ Base
Returns a new instance of Base.
224
225
226
|
# File 'lib/frozen_record/base.rb', line 224
def initialize(attrs = {})
@attributes = attrs.freeze
end
|
Class Attribute Details
.abstract_class ⇒ Object
Returns the value of attribute abstract_class.
75
76
77
|
# File 'lib/frozen_record/base.rb', line 75
def abstract_class
@abstract_class
end
|
Class Method Details
.abstract_class? ⇒ Boolean
84
85
86
|
# File 'lib/frozen_record/base.rb', line 84
def abstract_class?
defined?(@abstract_class) && @abstract_class
end
|
.add_index(attribute, unique: false) ⇒ Object
113
114
115
116
|
# File 'lib/frozen_record/base.rb', line 113
def add_index(attribute, unique: false)
index = unique ? UniqueIndex.new(self, attribute) : Index.new(self, attribute)
self.index_definitions = index_definitions.merge(index.attribute => index).freeze
end
|
.attributes ⇒ Object
77
78
79
80
81
82
|
# File 'lib/frozen_record/base.rb', line 77
def attributes
@attributes ||= begin
load_records
@attributes
end
end
|
.base_path=(base_path) ⇒ Object
70
71
72
73
|
# File 'lib/frozen_record/base.rb', line 70
def base_path=(base_path)
@file_path = nil
set_base_path(base_path)
end
|
.current_scope ⇒ Object
Also known as:
all
88
89
90
|
# File 'lib/frozen_record/base.rb', line 88
def current_scope
store[:scope] ||= Scope.new(self)
end
|
.current_scope=(scope) ⇒ Object
93
94
95
|
# File 'lib/frozen_record/base.rb', line 93
def current_scope=(scope)
store[:scope] = scope
end
|
.default_attributes=(default_attributes) ⇒ Object
58
59
60
|
# File 'lib/frozen_record/base.rb', line 58
def default_attributes=(default_attributes)
set_default_attributes(Dedup.deep_intern!(default_attributes.transform_keys(&:to_s)))
end
|
.eager_load! ⇒ Object
140
141
142
143
144
|
# File 'lib/frozen_record/base.rb', line 140
def eager_load!
return if auto_reloading || abstract_class?
load_records
end
|
.file_path ⇒ Object
101
102
103
104
105
106
107
108
109
110
111
|
# File 'lib/frozen_record/base.rb', line 101
def file_path
raise ArgumentError, "You must define `#{name}.base_path`" unless base_path
@file_path ||= begin
file_path = File.join(base_path, backend.filename(name))
if !File.exist?(file_path) && File.exist?("#{file_path}.erb")
"#{file_path}.erb"
else
file_path
end
end
end
|
.load ⇒ Object
169
|
# File 'lib/frozen_record/base.rb', line 169
alias_method :load, :new
|
.load_records(force: false) ⇒ Object
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
# File 'lib/frozen_record/base.rb', line 146
def load_records(force: false)
if force || (auto_reloading && file_changed?)
@records = nil
undefine_attribute_methods
end
@records ||= begin
records = backend.load(file_path)
if default_attributes
records = records.map { |r| assign_defaults!(r.dup).freeze }.freeze
end
@attributes = list_attributes(records).freeze
define_attribute_methods(@attributes.to_a)
records = with_max_records_scan(nil) { records.map { |r| load(r) }.freeze }
index_definitions.values.each { |index| index.build(records) }
records
end
end
|
.memsize(object = self, seen = Set.new.compare_by_identity) ⇒ Object
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
# File 'lib/frozen_record/base.rb', line 118
def memsize(object = self, seen = Set.new.compare_by_identity)
return 0 unless seen.add?(object)
size = ObjectSpace.memsize_of(object)
object.instance_variables.each { |v| size += memsize(object.instance_variable_get(v), seen) }
case object
when Hash
object.each { |k, v| size += memsize(k, seen) + memsize(v, seen) }
when Array
object.each { |i| size += memsize(i, seen) }
end
size
end
|
.new(attrs = {}) ⇒ Object
172
173
174
|
# File 'lib/frozen_record/base.rb', line 172
def new(attrs = {})
load(assign_defaults!(attrs.transform_keys(&:to_s)))
end
|
.primary_key=(primary_key) ⇒ Object
64
65
66
|
# File 'lib/frozen_record/base.rb', line 64
def primary_key=(primary_key)
set_primary_key(-primary_key.to_s)
end
|
.respond_to_missing?(name) ⇒ Boolean
133
134
135
136
137
138
|
# File 'lib/frozen_record/base.rb', line 133
def respond_to_missing?(name, *)
if name.to_s =~ FIND_BY_PATTERN
load_records return true if $1.split('_and_').all? { |attr| instance_method_already_implemented?(attr) }
end
end
|
.scope(name, body) ⇒ Object
165
166
167
|
# File 'lib/frozen_record/base.rb', line 165
def scope(name, body)
singleton_class.send(:define_method, name, &body)
end
|
.set_base_path ⇒ Object
68
|
# File 'lib/frozen_record/base.rb', line 68
alias_method :set_base_path, :base_path=
|
.set_default_attributes ⇒ Object
56
|
# File 'lib/frozen_record/base.rb', line 56
alias_method :set_default_attributes, :default_attributes=
|
.set_primary_key ⇒ Object
62
|
# File 'lib/frozen_record/base.rb', line 62
alias_method :set_primary_key, :primary_key=
|
.with_max_records_scan(value) ⇒ Object
48
49
50
51
52
53
54
|
# File 'lib/frozen_record/base.rb', line 48
def with_max_records_scan(value)
previous_max_records_scan = max_records_scan
self.max_records_scan = value
yield
ensure
self.max_records_scan = previous_max_records_scan
end
|
Instance Method Details
#==(other) ⇒ Object
241
242
243
|
# File 'lib/frozen_record/base.rb', line 241
def ==(other)
super || other.is_a?(self.class) && other.id == id
end
|
#[](attr) ⇒ Object
Also known as:
attribute
236
237
238
|
# File 'lib/frozen_record/base.rb', line 236
def [](attr)
@attributes[attr.to_s]
end
|
#attributes ⇒ Object
228
229
230
|
# File 'lib/frozen_record/base.rb', line 228
def attributes
@attributes.dup
end
|
#id ⇒ Object
232
233
234
|
# File 'lib/frozen_record/base.rb', line 232
def id
self[self.class.primary_key]
end
|
#persisted? ⇒ Boolean
245
246
247
|
# File 'lib/frozen_record/base.rb', line 245
def persisted?
true
end
|
#to_key ⇒ Object
249
250
251
|
# File 'lib/frozen_record/base.rb', line 249
def to_key
[id]
end
|