enumish 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +38 -4
- data/lib/enumish.rb +18 -3
- data/lib/enumish/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3996fbc95c17dbba17a1cdd9c19316a1b744a02
|
4
|
+
data.tar.gz: 0c39957e59b88433056262331370dfd761fa1a7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c64c8aa0568c57d7e167ed6e451615ccbd53657bd12ee5a91e2587d3c243d861072cdcd04968e4b6253bfa5a73c1706343a91283644475cac6c5aa7cf2b9e95
|
7
|
+
data.tar.gz: de7732dcc20673dca3559b0854929c6584181e89873445ac2a61aa000497bf1ca42abe7e611680bfe092e9841beb8b6a61bc764b91494b8fc77a094161a54013
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
# Enumish
|
2
2
|
|
3
|
-
Enumish is "Enum for ActiveRecord".
|
3
|
+
Enumish is "Database-backed Enum for ActiveRecord".
|
4
4
|
|
5
|
-
It gives you the ability to create Enum-like
|
5
|
+
It gives you the ability to create Enum-like properties directly in the database.
|
6
|
+
|
7
|
+
[![Build Status](https://travis-ci.org/cmer/enumish.svg?branch=master)](https://travis-ci.org/cmer/enumish)
|
6
8
|
|
7
9
|
## Simple Example
|
8
10
|
|
@@ -44,10 +46,14 @@ class Color < ActiveRecord
|
|
44
46
|
{ s.human_description => s.id }
|
45
47
|
end
|
46
48
|
end
|
49
|
+
|
50
|
+
def all_primary
|
51
|
+
Color.rank(:position).where(enabled: true).where(primary: true)
|
52
|
+
end
|
47
53
|
end
|
48
54
|
|
49
|
-
def
|
50
|
-
"#{self.to_s}
|
55
|
+
def human_description
|
56
|
+
"The color #{self.to_s}"
|
51
57
|
end
|
52
58
|
end
|
53
59
|
````
|
@@ -108,6 +114,34 @@ class Color < ActiveRecord
|
|
108
114
|
end
|
109
115
|
````
|
110
116
|
|
117
|
+
## Why not just use ActiveRecord::Enum?
|
118
|
+
|
119
|
+
Glad you asked! [`ActiveRecord::Enum`](http://api.rubyonrails.org/classes/ActiveRecord/Enum.html)
|
120
|
+
(AR::E going forward) is an option you should definitely consider if it fits your needs. I wrote
|
121
|
+
Enumish because I needed the following capabilities:
|
122
|
+
|
123
|
+
- Ability to have more than one enum field per model.
|
124
|
+
|
125
|
+
For example, a `Car` model could have the following Enumish properties:
|
126
|
+
`exterior_color`, `interior_color`, `model`, `transmission`. This would not be possible
|
127
|
+
with vanilla AR::E.
|
128
|
+
|
129
|
+
- Database-backed properties. There are many benefits to this. Notably, Enumish allows you to:
|
130
|
+
|
131
|
+
- Maintain an ever-evolving list of properties directly in the database instead of changing
|
132
|
+
and potentially breaking code. Your marketing team will love this!
|
133
|
+
- Keep a human-readable version of your Enumish properties in the database for your users
|
134
|
+
to see, or for your eyes only. Just add a `description` column.
|
135
|
+
- Enable or disable some properties. Just add an `enabled` column.
|
136
|
+
- Sort how properties are displayed to end-users. Pro-tip, just use
|
137
|
+
[`RankedModel`](https://github.com/mixonic/ranked-model).
|
138
|
+
- Limit possible Enumish properties under different circumstances. For example, a car from 2015
|
139
|
+
might have different color options than a car from 2016. Or in the example above, I have
|
140
|
+
an `.all_primary` method that only returns primary colors.
|
141
|
+
- Perform database `JOIN`s between your model and Enumish models.
|
142
|
+
- Maintain data integrity between your models and Enumish models. It's all just SQL after all.
|
143
|
+
|
144
|
+
|
111
145
|
## Installation
|
112
146
|
|
113
147
|
Add this line to your application's Gemfile:
|
data/lib/enumish.rb
CHANGED
@@ -8,7 +8,7 @@ module Enumish
|
|
8
8
|
|
9
9
|
module ClassMethods
|
10
10
|
def method_missing(method_id, *args, &block)
|
11
|
-
if !method_id.to_s.match(/\?$/)
|
11
|
+
if !method_id.to_s.match(/\?$/) && enum_ids.include?(method_id.to_s)
|
12
12
|
obj = self.where(enum_id => method_id.to_s).first
|
13
13
|
return obj if obj.present?
|
14
14
|
end
|
@@ -19,12 +19,27 @@ module Enumish
|
|
19
19
|
def enum_id
|
20
20
|
:short
|
21
21
|
end
|
22
|
+
|
23
|
+
def refresh_enum_ids!
|
24
|
+
Mutex.new.synchronize do
|
25
|
+
@enum_ids = self.pluck(enum_id)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def enum_ids
|
30
|
+
refresh_enum_ids! if @enum_ids.blank?
|
31
|
+
@enum_ids
|
32
|
+
end
|
22
33
|
end
|
23
34
|
|
24
35
|
# Allow calls such as object.friendly? or model.attitude.friendly?
|
25
36
|
def method_missing(method_id, *args, &block)
|
26
|
-
if method_id.to_s.match(/\?$/) && args.empty? && block.nil?
|
27
|
-
|
37
|
+
bare_method = if method_id.to_s.match(/\?$/) && args.empty? && block.nil?
|
38
|
+
method_id.to_s.sub(/\?$/, "")
|
39
|
+
end
|
40
|
+
|
41
|
+
if bare_method && self.class.enum_ids.include?(bare_method)
|
42
|
+
self.send(self.class.enum_id.to_s) == bare_method
|
28
43
|
else
|
29
44
|
super
|
30
45
|
end
|
data/lib/enumish/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enumish
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carl Mercier
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|