offline_lookup 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +61 -0
- data/lib/offline_lookup.rb +6 -55
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 887ba1b39a9ba252abb2a69d9ac652a8f9b3ded8
|
4
|
+
data.tar.gz: 8b0d2fc3a6d65b605fd951255e4a796c02dd58f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1e931dc2e984e21823e18cbbfcb56c6ff8d441a04ad6c8ee90bd618333345de655afa40852c2474cd65e3a819f9b4a66bae68907d97318845645bcb2ac32368
|
7
|
+
data.tar.gz: 9afcc20a56a0e6aec6c79cfa1a92ab36ea8c3f9928cb93fee8d07ecc502f65dcdf2920bf838a214265e9df398ea5a07e64cbecffad93b43b9d8c55b64e217d82
|
data/README.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
##Offline Lookup
|
2
|
+
|
3
|
+
Alhpa (0.0.2). Use at your own risk.
|
4
|
+
|
5
|
+
IMPORTANT: don't use this for models that have a lot of data!!
|
6
|
+
This is basically a in-memory pseudo-index intended to speed up quick, repeated
|
7
|
+
finds of index table values without trips to an external db machine.
|
8
|
+
It's also nicer syntax, e.g:
|
9
|
+
|
10
|
+
```
|
11
|
+
TurnaroundLevel.two_hour_id
|
12
|
+
TurnaroundLevel.quick_lookup("Two Hour")
|
13
|
+
Service.last.turnaround_level.two_hour?
|
14
|
+
```
|
15
|
+
|
16
|
+
In any ActiveRecord::Base subclass, use:
|
17
|
+
|
18
|
+
`use_offline_id_lookup column_name`
|
19
|
+
|
20
|
+
to define class methods that can convert between id and the corresponding
|
21
|
+
value in `column_name` for the class, without going to the database
|
22
|
+
|
23
|
+
`column_name` defaults to `:name`, but can be any column of the table
|
24
|
+
use the `:key` keyword arg if you're interested in a key colun other than `:id`
|
25
|
+
Usage example:
|
26
|
+
|
27
|
+
```
|
28
|
+
class TurnaroundLevel < ActiveRecord::Base
|
29
|
+
use_offline_lookup :level
|
30
|
+
...
|
31
|
+
end
|
32
|
+
```
|
33
|
+
|
34
|
+
If, for example, the first row of the turnaround_levels table has a `:level` of `"Same Day"`, this gives you
|
35
|
+
|
36
|
+
```
|
37
|
+
TurnaroundLevel.same_day_id
|
38
|
+
#=> 1
|
39
|
+
TurnaroundLevel.name_for_id(1)
|
40
|
+
#=> 'Same Day'
|
41
|
+
TurnaroundLevel.id_for_name('Same Day')
|
42
|
+
#=> 1
|
43
|
+
TurnaroundLevel.first.same_day?
|
44
|
+
#=> true
|
45
|
+
TurnaroundLevel.same_day
|
46
|
+
#=> <#TurnaroundLevel id: 1, level: "Same Day", ...>
|
47
|
+
```
|
48
|
+
|
49
|
+
The last of these methods is the "lookup" method, and is not quite offline. This is because we only store the key - name mappings, not the entire objects, in memory when we declare a new offline_lookup model. However it is included by default for convenient syntax (and it uses a lookup on what is usually the primary key of the table, in case the extra few ms matter to you). You can disable it by using
|
50
|
+
|
51
|
+
`use_offline_lookup :level, lookup_methods: false`
|
52
|
+
|
53
|
+
You can also disable the identity methods (e.g. `TurnaroundLevel.first.same_day?`) by using
|
54
|
+
|
55
|
+
`use_offline_lookup :level, identity_methods: false`
|
56
|
+
|
57
|
+
(And yes, the keywords can be combined, they're all optional keyword args)
|
58
|
+
|
59
|
+
## Known Issues
|
60
|
+
|
61
|
+
If two entries in the table have the same value in the specified field, all but one will get overwritten. In a future version, I plan to allow multiple-column specificaion, e.g. `use_offline_lookup [:firstname, :lastname]`
|
data/lib/offline_lookup.rb
CHANGED
@@ -1,61 +1,10 @@
|
|
1
|
-
# IMPORTANT: don't use this for models that have a lot of data!!
|
2
|
-
#
|
3
|
-
# This is basically a in-memory pseudo-index intended to speed up quick, repeated
|
4
|
-
# finds of index table values without trips to an external db machine.
|
5
|
-
# It's also nicer syntax, e.g:
|
6
|
-
# TurnaroundLevel.two_hour_id
|
7
|
-
# TurnaroundLevel.quick_lookup("Two Hour")
|
8
|
-
# Service.last.turnaround_level.two_hour?
|
9
|
-
#
|
10
|
-
# In any ActiveRecord::Base subclass, use:
|
11
|
-
# >> use_offline_id_lookup column_name
|
12
|
-
# to define class methods that can convert between id and the corresponding
|
13
|
-
# value in column_name for the class, without going to the database
|
14
|
-
#
|
15
|
-
# column_name defaults to :name, but can be any column of the table
|
16
|
-
# use the :key keyword arg if you're interested in a key colun other than :id
|
17
|
-
#
|
18
|
-
# Usage example:
|
19
|
-
# class JobType < ActiveRecord::Base
|
20
|
-
# use_offline_id_lookup
|
21
|
-
# ...
|
22
|
-
# end
|
23
|
-
#
|
24
|
-
# This gives you:
|
25
|
-
# JobType.editing_id
|
26
|
-
# #=> 1
|
27
|
-
# JobType.name_for_id(1)
|
28
|
-
# #=> 'Editing'
|
29
|
-
# JobType.id_for_name('Editing')
|
30
|
-
# #=> 1
|
31
|
-
# with no db queries.
|
32
|
-
#
|
33
|
-
# You can use this on multiple column names (currently
|
34
|
-
# need to call use_offline_id_lookup once for each column name)
|
35
|
-
# class InvoiceLineItemType < ActiveRecord::Base
|
36
|
-
# use_offline_id_lookup :name
|
37
|
-
# use_offline_id_lookup :accounting_label
|
38
|
-
# ...
|
39
|
-
#
|
40
|
-
# You get InvoiceLineItemType.name_for_id(id) and
|
41
|
-
# InvoiceLineItemType.account_label_for_id(id), etc.
|
42
|
-
# Beware that if any value occurs more than once,
|
43
|
-
# either in the same column or different columns for
|
44
|
-
# which use_offline_id_lookup was called, the <name>_id
|
45
|
-
# method will only use the last column for which it was observed.
|
46
|
-
|
47
|
-
|
48
|
-
#!!!
|
49
|
-
# TODO: requires :methodize
|
50
|
-
#!!!
|
51
|
-
|
52
1
|
# TODO: provide multiple column names in a single call (e.g. firstname, lastname)
|
53
2
|
# TODO: support multiple offline lookups per model
|
54
3
|
# TODO: support scope arg in use_offline_lookup (partial index)
|
55
4
|
|
56
5
|
module OfflineLookup
|
57
6
|
module ActiveRecord
|
58
|
-
def use_offline_lookup(field = :name, key: :id, lookup_methods: true)
|
7
|
+
def use_offline_lookup(field = :name, key: :id, identiyy_methods: true, lookup_methods: true)
|
59
8
|
class_attribute :offline_lookup_values, :offline_lookup_options
|
60
9
|
self.offline_lookup_options = {field: field.to_s, key: key.to_s, lookup_methods: lookup_methods}.freeze
|
61
10
|
self.offline_lookup_values = self.all.pluck(key, field).to_h.freeze
|
@@ -125,10 +74,12 @@ module OfflineLookup
|
|
125
74
|
end
|
126
75
|
|
127
76
|
# instance method: true if instance is of named type (e.g. FooType.first.bar?)
|
128
|
-
|
129
|
-
|
77
|
+
if self.offline_lookup_options[:identiyy_methods]
|
78
|
+
define_method(builder.indentiy_method_name(value)) do
|
79
|
+
self.attributes[self.offline_lookup_options[:key]] == key
|
80
|
+
end
|
130
81
|
end
|
131
|
-
|
82
|
+
|
132
83
|
# class method: get instance by named method (e.g. FooType.bar)
|
133
84
|
# not "Offline", but lookup by indexed key. Also, synactic sugar.
|
134
85
|
if self.offline_lookup_options[:lookup_methods]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: offline_lookup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Schwartz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Offline indexing of small tables for speed & convenience
|
14
14
|
email: ozydingo@gmail.com
|
@@ -16,6 +16,7 @@ executables: []
|
|
16
16
|
extensions: []
|
17
17
|
extra_rdoc_files: []
|
18
18
|
files:
|
19
|
+
- README.md
|
19
20
|
- lib/offline_lookup.rb
|
20
21
|
homepage:
|
21
22
|
licenses:
|