coded_attribute 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Manifest +8 -29
- data/README +83 -7
- data/README.rdoc +89 -0
- data/Rakefile +4 -3
- data/coded_attribute.gemspec +12 -6
- data/lib/coded_attribute.rb +19 -23
- data/rdoc/classes/CodedAttribute.html +167 -0
- data/rdoc/created.rid +1 -3
- data/rdoc/files/README.html +212 -0
- data/rdoc/files/lib/coded_attribute_rb.html +107 -0
- data/rdoc/fr_class_index.html +27 -0
- data/rdoc/fr_file_index.html +28 -0
- data/rdoc/fr_method_index.html +27 -0
- data/rdoc/index.html +20 -54
- data/rdoc/rdoc-style.css +208 -0
- metadata +51 -36
- data/rdoc/CodedAttributes.html +0 -226
- data/rdoc/README.html +0 -96
- data/rdoc/images/brick.png +0 -0
- data/rdoc/images/brick_link.png +0 -0
- data/rdoc/images/bug.png +0 -0
- data/rdoc/images/bullet_black.png +0 -0
- data/rdoc/images/bullet_toggle_minus.png +0 -0
- data/rdoc/images/bullet_toggle_plus.png +0 -0
- data/rdoc/images/date.png +0 -0
- data/rdoc/images/find.png +0 -0
- data/rdoc/images/loadingAnimation.gif +0 -0
- data/rdoc/images/macFFBgHack.png +0 -0
- data/rdoc/images/package.png +0 -0
- data/rdoc/images/page_green.png +0 -0
- data/rdoc/images/page_white_text.png +0 -0
- data/rdoc/images/page_white_width.png +0 -0
- data/rdoc/images/plugin.png +0 -0
- data/rdoc/images/ruby.png +0 -0
- data/rdoc/images/tag_green.png +0 -0
- data/rdoc/images/wrench.png +0 -0
- data/rdoc/images/wrench_orange.png +0 -0
- data/rdoc/images/zoom.png +0 -0
- data/rdoc/js/darkfish.js +0 -116
- data/rdoc/js/jquery.js +0 -32
- data/rdoc/js/quicksearch.js +0 -114
- data/rdoc/js/thickbox-compressed.js +0 -10
- data/rdoc/lib/coded_attributes_rb.html +0 -55
- data/rdoc/rdoc.css +0 -706
data/Manifest
CHANGED
@@ -1,41 +1,20 @@
|
|
1
1
|
MIT-LICENSE
|
2
2
|
Manifest
|
3
3
|
README
|
4
|
+
README.rdoc
|
4
5
|
Rakefile
|
5
|
-
coded_attribute.gemspec
|
6
6
|
init.rb
|
7
7
|
install.rb
|
8
8
|
lib/coded_attribute.rb
|
9
|
-
rdoc/
|
10
|
-
rdoc/README.html
|
9
|
+
rdoc/classes/CodedAttribute.html
|
11
10
|
rdoc/created.rid
|
12
|
-
rdoc/
|
13
|
-
rdoc/
|
14
|
-
rdoc/
|
15
|
-
rdoc/
|
16
|
-
rdoc/
|
17
|
-
rdoc/images/bullet_toggle_plus.png
|
18
|
-
rdoc/images/date.png
|
19
|
-
rdoc/images/find.png
|
20
|
-
rdoc/images/loadingAnimation.gif
|
21
|
-
rdoc/images/macFFBgHack.png
|
22
|
-
rdoc/images/package.png
|
23
|
-
rdoc/images/page_green.png
|
24
|
-
rdoc/images/page_white_text.png
|
25
|
-
rdoc/images/page_white_width.png
|
26
|
-
rdoc/images/plugin.png
|
27
|
-
rdoc/images/ruby.png
|
28
|
-
rdoc/images/tag_green.png
|
29
|
-
rdoc/images/wrench.png
|
30
|
-
rdoc/images/wrench_orange.png
|
31
|
-
rdoc/images/zoom.png
|
11
|
+
rdoc/files/README.html
|
12
|
+
rdoc/files/lib/coded_attribute_rb.html
|
13
|
+
rdoc/fr_class_index.html
|
14
|
+
rdoc/fr_file_index.html
|
15
|
+
rdoc/fr_method_index.html
|
32
16
|
rdoc/index.html
|
33
|
-
rdoc/
|
34
|
-
rdoc/js/jquery.js
|
35
|
-
rdoc/js/quicksearch.js
|
36
|
-
rdoc/js/thickbox-compressed.js
|
37
|
-
rdoc/lib/coded_attributes_rb.html
|
38
|
-
rdoc/rdoc.css
|
17
|
+
rdoc/rdoc-style.css
|
39
18
|
test/coded_attributes_test.rb
|
40
19
|
test/test_helper.rb
|
41
20
|
uninstall.rb
|
data/README
CHANGED
@@ -1,13 +1,89 @@
|
|
1
|
-
|
2
|
-
===============
|
1
|
+
=CodedAttribute
|
3
2
|
|
4
|
-
|
3
|
+
Two of my favorite MySQL datatypes are ENUMs and SETs. Unfortunately,
|
4
|
+
ActiveRecord doesn't appear to support these fields well, or provide a good
|
5
|
+
and simple alternative to the problem of coded values. In the past, I used to
|
6
|
+
write getters and setters that looked something like this to solve my problem.
|
5
7
|
|
8
|
+
class Article
|
9
|
+
STATUS_CODES => {
|
10
|
+
:deleted => 0, 0 => :deleted
|
11
|
+
:pending => 1, 1 => :pending,
|
12
|
+
:completed => 2, 2 => :completed,
|
13
|
+
:published => 3, 3 => :published
|
14
|
+
}
|
6
15
|
|
7
|
-
|
8
|
-
|
16
|
+
def status=(value)
|
17
|
+
value = value.to_sym if value.is_a?(String)
|
18
|
+
status_code = STATUS_CODES[value]
|
19
|
+
end
|
20
|
+
|
21
|
+
def status
|
22
|
+
STATUS_CODES[status_code]
|
23
|
+
end
|
24
|
+
end
|
9
25
|
|
10
|
-
|
26
|
+
Doesn't that code look horrible? Wouldn't it be better if it looked like this?!
|
11
27
|
|
28
|
+
class Article
|
29
|
+
coded_attribute :status {
|
30
|
+
0 => :deleted
|
31
|
+
1 => :pending
|
32
|
+
2 => :completed
|
33
|
+
3 => :published
|
34
|
+
end
|
35
|
+
end
|
12
36
|
|
13
|
-
|
37
|
+
Or, if we want to get even lazier!
|
38
|
+
|
39
|
+
class MyClass
|
40
|
+
coded_attribute :status, [ :deleted, :active, :pending, :deleted ]
|
41
|
+
end
|
42
|
+
|
43
|
+
If so, then you've come to the right place.
|
44
|
+
|
45
|
+
This plugin makes doing all of the above super easy. And your code (and other
|
46
|
+
programmers) will love you for using it! Like seriously love you!
|
47
|
+
|
48
|
+
==Coded Attributes
|
49
|
+
|
50
|
+
Lets get down to it. Suppose we have a car, and it can be any one of a variety
|
51
|
+
of colors. We can indicate this in the model with the following code:
|
52
|
+
|
53
|
+
class Car < ActiveRecord::Base
|
54
|
+
coded_attribute :color, [ :red, :orange, :yellow, :green, :blue, :indigo, :violet ]
|
55
|
+
end
|
56
|
+
|
57
|
+
But we aren't finished just yet. We still need to create a column to store our
|
58
|
+
attribute data in. There are two ways to go about this.
|
59
|
+
|
60
|
+
===Storing the Coded Value
|
61
|
+
|
62
|
+
The easiest way to store the coded value is to create an integer column in the
|
63
|
+
database by appending '_code' to the name of the attribute. So in our 'cars'
|
64
|
+
table, we could create a 'color_code' integer field. If you do not want to
|
65
|
+
name the column in your database 'color_code', you can replace :color, with a
|
66
|
+
:method => :column pair, for example:
|
67
|
+
|
68
|
+
class Car < ActiveRecord::Base
|
69
|
+
coded_attribute :color => :color_id, [ :red, orange, :yellow, :green, :blue, :indigo, :violet ]
|
70
|
+
end
|
71
|
+
|
72
|
+
==Coded Attribute Sets
|
73
|
+
|
74
|
+
If you do not want to use a SET datatype, coded_attribute_set an make use of an
|
75
|
+
integer bitmask to store the values.
|
76
|
+
|
77
|
+
class Car < ActiveRecord::Base
|
78
|
+
coded_attribute_set :color, [ :red, :orange, :yellow, :green, :blue, :indigo, :violet ]
|
79
|
+
end
|
80
|
+
|
81
|
+
=Planned Features
|
82
|
+
|
83
|
+
Future versions should hopefully support auto-detecting and setup of enum and
|
84
|
+
set types (so you don't need to even define the coded_attribute, it will be
|
85
|
+
done automatically on all classes).
|
86
|
+
|
87
|
+
I also plan on a method added to Migrations that allow you to easily recode data
|
88
|
+
|
89
|
+
Copyright (c) 2010 Jaden Carver, released under the MIT license
|
data/README.rdoc
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
=CodedAttribute
|
2
|
+
|
3
|
+
Two of my favorite MySQL datatypes are ENUMs and SETs. Unfortunately,
|
4
|
+
ActiveRecord doesn't appear to support these fields well, or provide a good
|
5
|
+
and simple alternative to the problem of coded values. In the past, I used to
|
6
|
+
write getters and setters that looked something like this to solve my problem.
|
7
|
+
|
8
|
+
class Article
|
9
|
+
STATUS_CODES => {
|
10
|
+
:deleted => 0, 0 => :deleted
|
11
|
+
:pending => 1, 1 => :pending,
|
12
|
+
:completed => 2, 2 => :completed,
|
13
|
+
:published => 3, 3 => :published
|
14
|
+
}
|
15
|
+
|
16
|
+
def status=(value)
|
17
|
+
value = value.to_sym if value.is_a?(String)
|
18
|
+
status_code = STATUS_CODES[value]
|
19
|
+
end
|
20
|
+
|
21
|
+
def status
|
22
|
+
STATUS_CODES[status_code]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
Doesn't that code look horrible? Wouldn't it be better if it looked like this?!
|
27
|
+
|
28
|
+
class Article
|
29
|
+
coded_attribute :status {
|
30
|
+
0 => :deleted
|
31
|
+
1 => :pending
|
32
|
+
2 => :completed
|
33
|
+
3 => :published
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
Or, if we want to get even lazier!
|
38
|
+
|
39
|
+
class MyClass
|
40
|
+
coded_attribute :status, [ :deleted, :active, :pending, :deleted ]
|
41
|
+
end
|
42
|
+
|
43
|
+
If so, then you've come to the right place.
|
44
|
+
|
45
|
+
This plugin makes doing all of the above super easy. And your code (and other
|
46
|
+
programmers) will love you for using it! Like seriously love you!
|
47
|
+
|
48
|
+
==Coded Attributes
|
49
|
+
|
50
|
+
Lets get down to it. Suppose we have a car, and it can be any one of a variety
|
51
|
+
of colors. We can indicate this in the model with the following code:
|
52
|
+
|
53
|
+
class Car < ActiveRecord::Base
|
54
|
+
coded_attribute :color, [ :red, :orange, :yellow, :green, :blue, :indigo, :violet ]
|
55
|
+
end
|
56
|
+
|
57
|
+
But we aren't finished just yet. We still need to create a column to store our
|
58
|
+
attribute data in. There are two ways to go about this.
|
59
|
+
|
60
|
+
===Storing the Coded Value
|
61
|
+
|
62
|
+
The easiest way to store the coded value is to create an integer column in the
|
63
|
+
database by appending '_code' to the name of the attribute. So in our 'cars'
|
64
|
+
table, we could create a 'color_code' integer field. If you do not want to
|
65
|
+
name the column in your database 'color_code', you can replace :color, with a
|
66
|
+
:method => :column pair, for example:
|
67
|
+
|
68
|
+
class Car < ActiveRecord::Base
|
69
|
+
coded_attribute :color => :color_id, [ :red, orange, :yellow, :green, :blue, :indigo, :violet ]
|
70
|
+
end
|
71
|
+
|
72
|
+
==Coded Attribute Sets
|
73
|
+
|
74
|
+
If you do not want to use a SET datatype, coded_attribute_set an make use of an
|
75
|
+
integer bitmask to store the values.
|
76
|
+
|
77
|
+
class Car < ActiveRecord::Base
|
78
|
+
coded_attribute_set :color, [ :red, :orange, :yellow, :green, :blue, :indigo, :violet ]
|
79
|
+
end
|
80
|
+
|
81
|
+
=Planned Features
|
82
|
+
|
83
|
+
Future versions should hopefully support auto-detecting and setup of enum and
|
84
|
+
set types (so you don't need to even define the coded_attribute, it will be
|
85
|
+
done automatically on all classes).
|
86
|
+
|
87
|
+
I also plan on a method added to Migrations that allow you to easily recode data
|
88
|
+
|
89
|
+
Copyright (c) 2010 Jaden Carver, released under the MIT license
|
data/Rakefile
CHANGED
@@ -7,13 +7,14 @@ require 'rake/rdoctask'
|
|
7
7
|
desc 'Default: run unit tests.'
|
8
8
|
task :default => :test
|
9
9
|
|
10
|
-
Echoe.new('coded_attribute', '0.0.
|
10
|
+
Echoe.new('coded_attribute', '0.0.4') do |p|
|
11
11
|
p.description = "ActiveRecord plugin for storing coded variables"
|
12
|
-
p.url = "http://github.com/
|
12
|
+
p.url = "http://github.com/windigo/coded_attribute"
|
13
13
|
p.author = "Jaden Carver"
|
14
14
|
p.email = "jaden.carver@gmail.com"
|
15
15
|
p.ignore_pattern = ["tmp/*", "script/*"]
|
16
|
-
p.development_dependencies = []
|
16
|
+
p.development_dependencies = [ "activerecord >=3.0.0" ]
|
17
|
+
p.runtime_dependencies = [ "activerecord >=3.0.0" ]
|
17
18
|
end
|
18
19
|
|
19
20
|
desc 'Test the coded_attributes plugin.'
|
data/coded_attribute.gemspec
CHANGED
@@ -2,30 +2,36 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{coded_attribute}
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.4"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Jaden Carver"]
|
9
|
-
s.date = %q{2010-11-
|
9
|
+
s.date = %q{2010-11-10}
|
10
10
|
s.description = %q{ActiveRecord plugin for storing coded variables}
|
11
11
|
s.email = %q{jaden.carver@gmail.com}
|
12
|
-
s.extra_rdoc_files = ["README", "lib/coded_attribute.rb"]
|
13
|
-
s.files = ["MIT-LICENSE", "Manifest", "README", "
|
14
|
-
s.homepage = %q{http://github.com/
|
12
|
+
s.extra_rdoc_files = ["README", "README.rdoc", "lib/coded_attribute.rb"]
|
13
|
+
s.files = ["MIT-LICENSE", "Manifest", "README", "README.rdoc", "Rakefile", "init.rb", "install.rb", "lib/coded_attribute.rb", "rdoc/classes/CodedAttribute.html", "rdoc/created.rid", "rdoc/files/README.html", "rdoc/files/lib/coded_attribute_rb.html", "rdoc/fr_class_index.html", "rdoc/fr_file_index.html", "rdoc/fr_method_index.html", "rdoc/index.html", "rdoc/rdoc-style.css", "test/coded_attributes_test.rb", "test/test_helper.rb", "uninstall.rb", "coded_attribute.gemspec"]
|
14
|
+
s.homepage = %q{http://github.com/windigo/coded_attribute}
|
15
15
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Coded_attribute", "--main", "README"]
|
16
16
|
s.require_paths = ["lib"]
|
17
17
|
s.rubyforge_project = %q{coded_attribute}
|
18
18
|
s.rubygems_version = %q{1.3.7}
|
19
19
|
s.summary = %q{ActiveRecord plugin for storing coded variables}
|
20
|
-
s.test_files = ["test/
|
20
|
+
s.test_files = ["test/coded_attributes_test.rb", "test/test_helper.rb"]
|
21
21
|
|
22
22
|
if s.respond_to? :specification_version then
|
23
23
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
24
24
|
s.specification_version = 3
|
25
25
|
|
26
26
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
27
|
+
s.add_runtime_dependency(%q<activerecord>, [">= 3.0.0"])
|
28
|
+
s.add_development_dependency(%q<activerecord>, [">= 3.0.0"])
|
27
29
|
else
|
30
|
+
s.add_dependency(%q<activerecord>, [">= 3.0.0"])
|
31
|
+
s.add_dependency(%q<activerecord>, [">= 3.0.0"])
|
28
32
|
end
|
29
33
|
else
|
34
|
+
s.add_dependency(%q<activerecord>, [">= 3.0.0"])
|
35
|
+
s.add_dependency(%q<activerecord>, [">= 3.0.0"])
|
30
36
|
end
|
31
37
|
end
|
data/lib/coded_attribute.rb
CHANGED
@@ -1,34 +1,30 @@
|
|
1
1
|
# CodedAttributes
|
2
2
|
|
3
3
|
module CodedAttribute
|
4
|
-
VERSION = 0.1
|
5
4
|
|
6
|
-
def coded_attribute(
|
7
|
-
if
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
def coded_attribute(*attributes_and_codes)
|
6
|
+
if attributes_and_codes.last.is_a? Hash
|
7
|
+
codes = attributes_and_codes.pop
|
8
|
+
elsif attributes_and_codes.last.is_a? Array
|
9
|
+
codes = attributes_and_codes.pop.inject({}) { |h, v| h.merge! h.keys.count => v }
|
11
10
|
end
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
raise ArgumentError, "Too many arguments" unless attribute_or_codes.blank?
|
16
|
-
elsif attribute_or_codes.first.class == Array
|
17
|
-
codes = attribute_or_codes.shift.inject({}) { |h, v| h.merge! h.keys.count => v }
|
18
|
-
raise ArgumentError, "Too many arguments" unless attribute_or_codes.blank?
|
19
|
-
else
|
20
|
-
codes = attribute_or_codes.inject({}) { |h, v| h.merge! h.keys.count => v }
|
12
|
+
attributes = attributes_and_codes.inject({}) do |hash, attribute|
|
13
|
+
hash.merge! attribute.is_a? Hash ? attribute : { attribute => "#{attribute}_code" }
|
21
14
|
end
|
22
15
|
|
23
|
-
|
24
|
-
|
16
|
+
attributes.each_pair do |method, attribute|
|
17
|
+
class_variable_set :"@@#{method}_codes", codes
|
18
|
+
cattr_reader :"#{method}_codes"
|
25
19
|
|
26
|
-
|
27
|
-
|
28
|
-
|
20
|
+
define_method :"#{method}" do
|
21
|
+
self.class.class_variable_get("@@#{method}_codes")[read_attribute(attribute)]
|
22
|
+
end
|
23
|
+
|
24
|
+
define_method :"#{method}=" do |value|
|
25
|
+
write_attribute(attribute, self.class.class_variable_get("@@#{method}_codes").key(value.to_sym))
|
26
|
+
end
|
27
|
+
end # attributes.each_pair
|
28
|
+
end # def coded_attribute
|
29
29
|
|
30
|
-
define_method :"#{method}=" do |value|
|
31
|
-
write_attribute(attribute, self.class.class_variable_get("@@#{method}_codes").key(value.to_sym))
|
32
|
-
end
|
33
|
-
end # def coded
|
34
30
|
end # module CodedAttributes
|
@@ -0,0 +1,167 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
7
|
+
<head>
|
8
|
+
<title>Module: CodedAttribute</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
11
|
+
<link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
|
12
|
+
<script type="text/javascript">
|
13
|
+
// <![CDATA[
|
14
|
+
|
15
|
+
function popupCode( url ) {
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
+
}
|
18
|
+
|
19
|
+
function toggleCode( id ) {
|
20
|
+
if ( document.getElementById )
|
21
|
+
elem = document.getElementById( id );
|
22
|
+
else if ( document.all )
|
23
|
+
elem = eval( "document.all." + id );
|
24
|
+
else
|
25
|
+
return false;
|
26
|
+
|
27
|
+
elemStyle = elem.style;
|
28
|
+
|
29
|
+
if ( elemStyle.display != "block" ) {
|
30
|
+
elemStyle.display = "block"
|
31
|
+
} else {
|
32
|
+
elemStyle.display = "none"
|
33
|
+
}
|
34
|
+
|
35
|
+
return true;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Make codeblocks hidden by default
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
+
|
41
|
+
// ]]>
|
42
|
+
</script>
|
43
|
+
|
44
|
+
</head>
|
45
|
+
<body>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
<div id="classHeader">
|
50
|
+
<table class="header-table">
|
51
|
+
<tr class="top-aligned-row">
|
52
|
+
<td><strong>Module</strong></td>
|
53
|
+
<td class="class-name-in-header">CodedAttribute</td>
|
54
|
+
</tr>
|
55
|
+
<tr class="top-aligned-row">
|
56
|
+
<td><strong>In:</strong></td>
|
57
|
+
<td>
|
58
|
+
<a href="../files/lib/coded_attribute_rb.html">
|
59
|
+
lib/coded_attribute.rb
|
60
|
+
</a>
|
61
|
+
<br />
|
62
|
+
</td>
|
63
|
+
</tr>
|
64
|
+
|
65
|
+
</table>
|
66
|
+
</div>
|
67
|
+
<!-- banner header -->
|
68
|
+
|
69
|
+
<div id="bodyContent">
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
<div id="contextContent">
|
74
|
+
|
75
|
+
<div id="description">
|
76
|
+
<p>
|
77
|
+
CodedAttributes
|
78
|
+
</p>
|
79
|
+
|
80
|
+
</div>
|
81
|
+
|
82
|
+
|
83
|
+
</div>
|
84
|
+
|
85
|
+
<div id="method-list">
|
86
|
+
<h3 class="section-bar">Methods</h3>
|
87
|
+
|
88
|
+
<div class="name-list">
|
89
|
+
<a href="#M000001">coded_attribute</a>
|
90
|
+
</div>
|
91
|
+
</div>
|
92
|
+
|
93
|
+
</div>
|
94
|
+
|
95
|
+
|
96
|
+
<!-- if includes -->
|
97
|
+
|
98
|
+
<div id="section">
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
<!-- if method_list -->
|
108
|
+
<div id="methods">
|
109
|
+
<h3 class="section-bar">Public Instance methods</h3>
|
110
|
+
|
111
|
+
<div id="method-M000001" class="method-detail">
|
112
|
+
<a name="M000001"></a>
|
113
|
+
|
114
|
+
<div class="method-heading">
|
115
|
+
<a href="#M000001" class="method-signature">
|
116
|
+
<span class="method-name">coded_attribute</span><span class="method-args">(*attributes_and_codes)</span>
|
117
|
+
</a>
|
118
|
+
</div>
|
119
|
+
|
120
|
+
<div class="method-description">
|
121
|
+
<p><a class="source-toggle" href="#"
|
122
|
+
onclick="toggleCode('M000001-source');return false;">[Source]</a></p>
|
123
|
+
<div class="method-source-code" id="M000001-source">
|
124
|
+
<pre>
|
125
|
+
<span class="ruby-comment cmt"># File lib/coded_attribute.rb, line 5</span>
|
126
|
+
5: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">coded_attribute</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">attributes_and_codes</span>)
|
127
|
+
6: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">attributes_and_codes</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">Hash</span>
|
128
|
+
7: <span class="ruby-identifier">codes</span> = <span class="ruby-identifier">attributes_and_codes</span>.<span class="ruby-identifier">pop</span>
|
129
|
+
8: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">attributes_and_codes</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">Array</span>
|
130
|
+
9: <span class="ruby-identifier">codes</span> = <span class="ruby-identifier">attributes_and_codes</span>.<span class="ruby-identifier">pop</span>.<span class="ruby-identifier">inject</span>({}) { <span class="ruby-operator">|</span><span class="ruby-identifier">h</span>, <span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">h</span>.<span class="ruby-identifier">merge!</span> <span class="ruby-identifier">h</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">count</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">v</span> }
|
131
|
+
10: <span class="ruby-keyword kw">end</span>
|
132
|
+
11:
|
133
|
+
12: <span class="ruby-identifier">attributes</span> = <span class="ruby-identifier">attributes_and_codes</span>.<span class="ruby-identifier">inject</span>({}) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">hash</span>, <span class="ruby-identifier">attribute</span><span class="ruby-operator">|</span>
|
134
|
+
13: <span class="ruby-identifier">hash</span>.<span class="ruby-identifier">merge!</span> <span class="ruby-identifier">attribute</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">Hash</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">attribute</span> <span class="ruby-operator">:</span> { <span class="ruby-identifier">attribute</span> =<span class="ruby-operator">></span> <span class="ruby-node">"#{attribute}_code"</span> }
|
135
|
+
14: <span class="ruby-keyword kw">end</span>
|
136
|
+
15:
|
137
|
+
16: <span class="ruby-identifier">attributes</span>.<span class="ruby-identifier">each_pair</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">method</span>, <span class="ruby-identifier">attribute</span><span class="ruby-operator">|</span>
|
138
|
+
17: <span class="ruby-identifier">class_variable_set</span> <span class="ruby-node">"@@#{method}_codes"</span><span class="ruby-node">"@@#{method}_codes"</span>, <span class="ruby-identifier">codes</span>
|
139
|
+
18: <span class="ruby-identifier">cattr_reader</span> <span class="ruby-node">"#{method}_codes"</span><span class="ruby-node">"#{method}_codes"</span>
|
140
|
+
19:
|
141
|
+
20: <span class="ruby-identifier">define_method</span> <span class="ruby-node">"#{method}"</span><span class="ruby-node">"#{method}"</span> <span class="ruby-keyword kw">do</span>
|
142
|
+
21: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">class_variable_get</span>(<span class="ruby-node">"@@#{method}_codes"</span>)[<span class="ruby-identifier">read_attribute</span>(<span class="ruby-identifier">attribute</span>)]
|
143
|
+
22: <span class="ruby-keyword kw">end</span>
|
144
|
+
23:
|
145
|
+
24: <span class="ruby-identifier">define_method</span> <span class="ruby-node">"#{method}="</span><span class="ruby-node">"#{method}="</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">value</span><span class="ruby-operator">|</span>
|
146
|
+
25: <span class="ruby-identifier">write_attribute</span>(<span class="ruby-identifier">attribute</span>, <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">class_variable_get</span>(<span class="ruby-node">"@@#{method}_codes"</span>).<span class="ruby-identifier">key</span>(<span class="ruby-identifier">value</span>.<span class="ruby-identifier">to_sym</span>))
|
147
|
+
26: <span class="ruby-keyword kw">end</span>
|
148
|
+
27: <span class="ruby-keyword kw">end</span> <span class="ruby-comment cmt"># attributes.each_pair</span>
|
149
|
+
28: <span class="ruby-keyword kw">end</span>
|
150
|
+
</pre>
|
151
|
+
</div>
|
152
|
+
</div>
|
153
|
+
</div>
|
154
|
+
|
155
|
+
|
156
|
+
</div>
|
157
|
+
|
158
|
+
|
159
|
+
</div>
|
160
|
+
|
161
|
+
|
162
|
+
<div id="validator-badges">
|
163
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
164
|
+
</div>
|
165
|
+
|
166
|
+
</body>
|
167
|
+
</html>
|