activerecord-utils 0.0.1 → 0.1.0

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/README.md CHANGED
@@ -2,3 +2,65 @@
2
2
 
3
3
  activerecord-utils gem - utilities (e.g. random, alias_attr, etc.) for activerecord in ruby
4
4
 
5
+ * home :: [github.com/rubylibs/activerecord-utils](https://github.com/rubylibs/activerecord-utils)
6
+ * bugs :: [github.com/rubylibs/activerecord-utils/issues](https://github.com/rubylibs/activerecord-utils/issues)
7
+ * gem :: [rubygems.org/gems/activerecord-utils](https://rubygems.org/gems/activerecord-utils)
8
+ * rdoc :: [rubydoc.info/gems/activerecord-utils](http://rubydoc.info/gems/activerecord-utils)
9
+
10
+ ## Usage
11
+
12
+ ### `alias_attr` macro
13
+
14
+
15
+ alias_attr :plato, :og # new, old
16
+
17
+ generates
18
+
19
+ def plato # reader
20
+ send( :og ) # e.g. return og
21
+ end
22
+
23
+ def plato=(value) # writer
24
+ send( :'og=', value ) # e.g. return self.og=value
25
+ end
26
+
27
+
28
+ ### `attr_reader_w_fallback` macro
29
+
30
+ attr_reader_w_fallbacks :published, :touched
31
+
32
+ generates
33
+
34
+ def published
35
+ read_attribute_w_fallbacks( :published, :touched )
36
+ end
37
+
38
+
39
+ ### 'rnd' finder
40
+
41
+ e.g. find random record e.g.
42
+
43
+
44
+ beer_of_the_week = Beer.rnd
45
+
46
+ equals
47
+
48
+ beer_of_the_week = Beer.offset( rand( Beer.count) ).limit(1).first
49
+
50
+
51
+
52
+ ## Alternatives
53
+
54
+ ### Random
55
+
56
+ - [`random_record` gem](http://rubygems.org/gems/random_record) - [(Source)](https://github.com/rahult/random_record) returns a random record for Ruby Models using ActiveRecord
57
+ - [`activerecord_random` gem](http://rubygems.org/gems/activerecord_random) - [(Source)](https://github.com/GnomesLab/activerecord_random) empowers your ActiveRecord Models with the ability to return a random record without using SQL RAND()
58
+ - [`randomizr` gem](http://rubygems.org/gems/randomizr) - Returns one random Active Record object using cross-platform ANSI compliant SQL
59
+ - [`fast_random` gem](http://rubygems.org/gems/fast_random) - [(Source)](https://github.com/xdite/fast_random) ultra fast order by rand() solution
60
+ - [`randumb`](https://github.com/spilliton/randumb) - adds ability to pull back random records from Active Record
61
+
62
+
63
+ ## License
64
+
65
+ The scripts are dedicated to the public domain.
66
+ Use it as you please with no restrictions whatsoever.
@@ -1,9 +1,10 @@
1
1
 
2
2
 
3
- require 'activerecord/utils/version' # let it always go first
3
+ require 'activerecord/utils/version' # let version always go first
4
4
 
5
5
 
6
6
  module ActiveRecord
7
+
7
8
  module Utils
8
9
 
9
10
  def self.banner
@@ -15,10 +16,109 @@ module Utils
15
16
  "#{File.expand_path( File.dirname(File.dirname(__FILE__)) )}"
16
17
  end
17
18
  =end
18
-
19
19
  end # module Utils
20
+
20
21
  end # module ActiveRecord
21
22
 
22
23
 
24
+ ########################
25
+ # add some methods to ActiveRecord::Base
26
+ #
27
+ # - todo: use Concerns ?? why? why not??
28
+
29
+
30
+ class ActiveRecord::Base
31
+
32
+ ### note:
33
+ ## alias_method will NOT work for activerecord attributes
34
+ ## - attribute reader/writer will NOT exist on startup
35
+ # thus, lets add a new alias_attr that will
36
+ # send message / forward method call on demand
37
+ #
38
+ # e.g. use like:
39
+ #
40
+ # alias_attr :abvii, :abv
41
+
42
+ ##
43
+ # todo: add opts={} e.g. lets us add, for example, depreciated: true ??
44
+ # - will issue a warning
45
+
46
+ def self.alias_attr_reader( new, old )
47
+ define_method( new ) do
48
+ send( old )
49
+ ### use read_attribute( old ) instead? why? why not??
50
+ # see http://www.davidverhasselt.com/2011/06/28/5-ways-to-set-attributes-in-activerecord/
51
+ end
52
+ ## todo: check for boolean values - add new? version too ??
53
+ end
54
+
55
+ def self.alias_attr_writer( new, old )
56
+ define_method( "#{new}=" ) do |value|
57
+ send( "#{old}=", value )
58
+ end
59
+ end
60
+
61
+ def self.alias_attr( new, old )
62
+ alias_attr_reader( new, old )
63
+ alias_attr_writer( new, old )
64
+ end
65
+
66
+ ###################
67
+ #
68
+ #
69
+ # e.g. use like:
70
+ #
71
+ # def published
72
+ # read_attribute_w_fallbacks( :published, :touched )
73
+ # end
74
+ #
75
+ # or use macro e.g.
76
+ #
77
+ # attr_reader_w_fallbacks :published, :touched
78
+
79
+
80
+ def self.attr_reader_w_fallbacks( *keys )
81
+ define_method( keys[0] ) do
82
+ read_attribute_w_fallbacks( keys )
83
+ end
84
+ end
85
+
86
+ def read_attribute_w_fallbacks( *keys )
87
+ ### todo: use a different name e.g.:
88
+ ## read_attribute_cascade ?? - does anything like this exists already?
89
+ ## why? why not?
90
+ keys.each do |key|
91
+ value = read_attribute( key )
92
+ return value unless value.nil?
93
+ end
94
+ value # fallthrough? return latest value (will be nil) --or return just nil - why? why not??
95
+ end
96
+
97
+
98
+ ###############
99
+ # random
100
+ #
101
+ #
102
+ # e.g. use like:
103
+ #
104
+ # beer_of_the_week = Beer.rnd
105
+
106
+
107
+ def self.rnd
108
+ ## works w/ sqlite3 and postgresql
109
+ ## - check if it works w/ mysql/mariadb too ? suppots offset and limit in SQL?
110
+
111
+ ## todo: use ::rand -- and lets add an self.rand alias too ??
112
+ ## check if ::rand call works
113
+ rnd_offset = rand( self.count ) ## NB: call "global" std lib rand
114
+
115
+ self.offset( rnd_offset ).limit( 1 ).first
116
+ end
117
+
118
+
119
+ end # class ActiveRecord::Base
120
+
121
+
122
+
23
123
  puts ActiveRecord::Utils.banner # say hello
24
124
 
@@ -2,7 +2,7 @@
2
2
  module ActiveRecord
3
3
 
4
4
  module Utils
5
- VERSION = '0.0.1'
5
+ VERSION = '0.1.0'
6
6
  end
7
7
 
8
8
  end # module ActiveRecord
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-22 00:00:00.000000000 Z
12
+ date: 2013-11-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rdoc
16
- requirement: &78028610 !ruby/object:Gem::Requirement
16
+ requirement: &71207220 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.10'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *78028610
24
+ version_requirements: *71207220
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: hoe
27
- requirement: &78028350 !ruby/object:Gem::Requirement
27
+ requirement: &71206890 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '3.3'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *78028350
35
+ version_requirements: *71206890
36
36
  description: activerecord-utils - utilities (e.g. random, alias_attr, etc.) for activerecord
37
37
  email: webslideshow@googlegroups.com
38
38
  executables: []