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.
213
214
215
|
# File 'lib/frozen_record/base.rb', line 213
def initialize(attrs = {})
@attributes = attrs.freeze
end
|
Class Attribute Details
.abstract_class ⇒ Object
Returns the value of attribute abstract_class.
64
65
66
|
# File 'lib/frozen_record/base.rb', line 64
def abstract_class
@abstract_class
end
|
Class Method Details
.abstract_class? ⇒ Boolean
73
74
75
|
# File 'lib/frozen_record/base.rb', line 73
def abstract_class?
defined?(@abstract_class) && @abstract_class
end
|
.add_index(attribute, unique: false) ⇒ Object
102
103
104
105
|
# File 'lib/frozen_record/base.rb', line 102
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
66
67
68
69
70
71
|
# File 'lib/frozen_record/base.rb', line 66
def attributes
@attributes ||= begin
load_records
@attributes
end
end
|
.base_path=(base_path) ⇒ Object
59
60
61
62
|
# File 'lib/frozen_record/base.rb', line 59
def base_path=(base_path)
@file_path = nil
set_base_path(base_path)
end
|
.current_scope ⇒ Object
Also known as:
all
77
78
79
|
# File 'lib/frozen_record/base.rb', line 77
def current_scope
store[:scope] ||= Scope.new(self)
end
|
.current_scope=(scope) ⇒ Object
82
83
84
|
# File 'lib/frozen_record/base.rb', line 82
def current_scope=(scope)
store[:scope] = scope
end
|
.default_attributes=(default_attributes) ⇒ Object
47
48
49
|
# File 'lib/frozen_record/base.rb', line 47
def default_attributes=(default_attributes)
set_default_attributes(Dedup.deep_intern!(default_attributes.transform_keys(&:to_s)))
end
|
.eager_load! ⇒ Object
129
130
131
132
133
|
# File 'lib/frozen_record/base.rb', line 129
def eager_load!
return if auto_reloading || abstract_class?
load_records
end
|
.file_path ⇒ Object
90
91
92
93
94
95
96
97
98
99
100
|
# File 'lib/frozen_record/base.rb', line 90
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
158
|
# File 'lib/frozen_record/base.rb', line 158
alias_method :load, :new
|
.load_records(force: false) ⇒ Object
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
# File 'lib/frozen_record/base.rb', line 135
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 = 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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
# File 'lib/frozen_record/base.rb', line 107
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
161
162
163
|
# File 'lib/frozen_record/base.rb', line 161
def new(attrs = {})
load(assign_defaults!(attrs.transform_keys(&:to_s)))
end
|
.primary_key=(primary_key) ⇒ Object
53
54
55
|
# File 'lib/frozen_record/base.rb', line 53
def primary_key=(primary_key)
set_primary_key(-primary_key.to_s)
end
|
.respond_to_missing?(name) ⇒ Boolean
122
123
124
125
126
127
|
# File 'lib/frozen_record/base.rb', line 122
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
154
155
156
|
# File 'lib/frozen_record/base.rb', line 154
def scope(name, body)
singleton_class.send(:define_method, name, &body)
end
|
.set_base_path ⇒ Object
57
|
# File 'lib/frozen_record/base.rb', line 57
alias_method :set_base_path, :base_path=
|
.set_default_attributes ⇒ Object
45
|
# File 'lib/frozen_record/base.rb', line 45
alias_method :set_default_attributes, :default_attributes=
|
.set_primary_key ⇒ Object
51
|
# File 'lib/frozen_record/base.rb', line 51
alias_method :set_primary_key, :primary_key=
|
Instance Method Details
#==(other) ⇒ Object
230
231
232
|
# File 'lib/frozen_record/base.rb', line 230
def ==(other)
super || other.is_a?(self.class) && other.id == id
end
|
#[](attr) ⇒ Object
Also known as:
attribute
225
226
227
|
# File 'lib/frozen_record/base.rb', line 225
def [](attr)
@attributes[attr.to_s]
end
|
#attributes ⇒ Object
217
218
219
|
# File 'lib/frozen_record/base.rb', line 217
def attributes
@attributes.dup
end
|
#id ⇒ Object
221
222
223
|
# File 'lib/frozen_record/base.rb', line 221
def id
self[self.class.primary_key]
end
|
#persisted? ⇒ Boolean
234
235
236
|
# File 'lib/frozen_record/base.rb', line 234
def persisted?
true
end
|
#to_key ⇒ Object
238
239
240
|
# File 'lib/frozen_record/base.rb', line 238
def to_key
[id]
end
|