activerecord-multiconditions 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/CHANGELOG +5 -0
- data/MIT-LICENSE +21 -0
- data/Manifest +13 -0
- data/README +189 -0
- data/Rakefile +58 -0
- data/TODO +9 -0
- data/activerecord-multiconditions.gemspec +90 -0
- data/lib/multi_conditions.rb +167 -0
- data/setup.rb +1585 -0
- data/test/db/test.sqlite3 +0 -0
- data/test/helper.rb +31 -0
- data/test/helper_database.rb +47 -0
- data/test/test_all.rb +16 -0
- data/test/unit/multi_conditions_test.rb +114 -0
- metadata +82 -0
data/CHANGELOG
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright (c) 2008 Simone Carletti <weppos@weppos.net>
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
data/Manifest
ADDED
data/README
ADDED
@@ -0,0 +1,189 @@
|
|
1
|
+
= ActiveRecord::MultiConditions
|
2
|
+
|
3
|
+
MultiConditions is a simple ActiveRecord plugin for storing ActiveRecord query conditions and make complex queries painless.
|
4
|
+
|
5
|
+
|
6
|
+
== Overview
|
7
|
+
|
8
|
+
This plugin doesn't replace ActiveRecord#with_scope method,
|
9
|
+
nor the basic :condition usage but extends it with the ability
|
10
|
+
of storing illimitate conditions in multiple step.
|
11
|
+
|
12
|
+
conditions = MultiConditions.new
|
13
|
+
# ... do some elaboration
|
14
|
+
conditions.append_condition(['active = ? AND query LIKE ?', true, '%foo']
|
15
|
+
# ... other elaboration
|
16
|
+
conditions.append_condition(['name = ?', 'aname']
|
17
|
+
|
18
|
+
conditions.to_conditions
|
19
|
+
# => "active = true AND query LIKE '%foo' AND name = 'aname'"
|
20
|
+
|
21
|
+
|
22
|
+
== Dependencies
|
23
|
+
|
24
|
+
* Ruby 1.8.6
|
25
|
+
* ActiveRecord 2.0 (or greater)
|
26
|
+
|
27
|
+
If you want to run the test suite:
|
28
|
+
|
29
|
+
* sqlite3-ruby
|
30
|
+
|
31
|
+
|
32
|
+
== Source
|
33
|
+
|
34
|
+
MultiConditions source code is managed via GIT and hosted at GitHub: http://github.com/weppos/activerecord-multiconditions/.
|
35
|
+
|
36
|
+
|
37
|
+
== Download and Installation
|
38
|
+
|
39
|
+
Installing ActiveRecord MultiConditions as a GEM is probably the best and easiest way. You must have {RubyGems}[http://rubyforge.org/projects/rubygems/] installed for the following instruction to work:
|
40
|
+
|
41
|
+
$ sudo gem install activerecord-multiconditions
|
42
|
+
|
43
|
+
To install the library manually grab the source code from the website, navigate to the root library directory and enter:
|
44
|
+
|
45
|
+
$ sudo ruby setup.rb
|
46
|
+
|
47
|
+
If you need the latest development version you can download the source code from the GIT repositories listed above. Beware that the code might not as stable as the official release.
|
48
|
+
|
49
|
+
|
50
|
+
== Usage
|
51
|
+
|
52
|
+
First, don't forget to require the library.
|
53
|
+
|
54
|
+
gem 'activerecord-multiconditions'
|
55
|
+
require 'multi_conditions'
|
56
|
+
|
57
|
+
Now +MultiConditions+ object is automatically available as subclass of any ActiveRecord object.
|
58
|
+
|
59
|
+
class Task < ActiveRecord::Base; end
|
60
|
+
|
61
|
+
multiconditions = Task::Multiconditions.new
|
62
|
+
# => new instance
|
63
|
+
|
64
|
+
=== Create a new instance
|
65
|
+
|
66
|
+
As stated by the Important section above, you first need a valid ActiveRecord model
|
67
|
+
to create a MultiConditions instance.
|
68
|
+
Because MultiConditions helps you to deal with ActiveRecord queries,
|
69
|
+
it's easy to understand why you *MUST* establish a valid database connection
|
70
|
+
and have at least one table (mapped with a Model) to query.
|
71
|
+
|
72
|
+
If you use ActiveRecord from Rails, this is just a matter of creating a new Model.
|
73
|
+
|
74
|
+
# create the Task model
|
75
|
+
class Task < ActiveRecord::Base
|
76
|
+
end
|
77
|
+
|
78
|
+
Now MultiConditions is automatically available within your Task namespace.
|
79
|
+
You can use it in whatever class method, for example:
|
80
|
+
|
81
|
+
class Task < ActiveRecord::Base
|
82
|
+
|
83
|
+
def complex_search()
|
84
|
+
c = MultiConditions.new(:foo => 'bar')
|
85
|
+
Task.find(:all, c.to_conditions)
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
But you can also create a new instance from an other library, class or model.
|
91
|
+
Just remember to initialize MultiConditions from its own namespace.
|
92
|
+
|
93
|
+
class Foo
|
94
|
+
class << self
|
95
|
+
def my_cool_conditions
|
96
|
+
Task::MultiConditions.new(:foo => 1).to_conditions
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
Foo.my_cool_conditions
|
102
|
+
# => 'foo = 1'
|
103
|
+
|
104
|
+
=== Appending conditions
|
105
|
+
|
106
|
+
You can append new conditions calling
|
107
|
+
|
108
|
+
* #append_condition
|
109
|
+
* #prepend_condition
|
110
|
+
|
111
|
+
and passing the conditions you want to append or prepend.
|
112
|
+
See Condition Types section to lean more about supported objects.
|
113
|
+
|
114
|
+
conditions = MultiConditions.new
|
115
|
+
conditions.append_condition(['active = ? AND query LIKE ?', true, '%foo']
|
116
|
+
conditions.prepend_condition(['name = ?', 'aname']
|
117
|
+
|
118
|
+
conditions.to_conditions
|
119
|
+
# => "name = 'aname' AND active = true AND query LIKE '%foo'"
|
120
|
+
|
121
|
+
|
122
|
+
=== Condition types
|
123
|
+
|
124
|
+
The MultiConditions object accepts any type of conditions supported by ActiveRecord,
|
125
|
+
including Strings, Arrays and Hashes, and merges them alltogether
|
126
|
+
just before sending the final :condition value to ActiveRecord search method.
|
127
|
+
|
128
|
+
conditions = MultiConditions.new
|
129
|
+
conditions.append_conditions(:foo => 1, :bar => 2)
|
130
|
+
conditions.append_conditions('active = 1')
|
131
|
+
conditions.append_conditions(['name LIKE ?', '%foo'])
|
132
|
+
|
133
|
+
conditions.to_conditions
|
134
|
+
# => 'foo = 1 AND :bar = 2 AND active = 1 AND name LIKE '%foo'
|
135
|
+
|
136
|
+
See ActiveRecord::Base#find documentation for more conditions examples.
|
137
|
+
|
138
|
+
|
139
|
+
|
140
|
+
== Important
|
141
|
+
|
142
|
+
Once loaded, this library become part of ActiveRecord package and
|
143
|
+
creates its own namespace at ActiveRecord::Base::MultiConditions.
|
144
|
+
|
145
|
+
require 'multi_conditions'
|
146
|
+
|
147
|
+
For various reason, you cannot initialize a new ActiveRecord::Base::MultiConditions
|
148
|
+
but you *MUST* initialize a MultiConditions instance from a Model.
|
149
|
+
|
150
|
+
# The wrong way
|
151
|
+
# raises Message: <"undefined method `abstract_class?' for Object:Class">
|
152
|
+
ActiveRecord::Base::MultiConditions.new
|
153
|
+
|
154
|
+
# The right way
|
155
|
+
class Model < ActiveRecord::Base
|
156
|
+
|
157
|
+
def a_method()
|
158
|
+
c = MultiConditions.new
|
159
|
+
find(:all, :conditions => c.to_conditions)
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
163
|
+
|
164
|
+
|
165
|
+
== Author
|
166
|
+
|
167
|
+
* {Simone Carletti}[http://www.simonecarletti.com/] <weppos@weppos.net>
|
168
|
+
|
169
|
+
If you like this software, please {recommend me}[http://www.workingwithrails.com/person/11967-simone-carletti] at Working with Rails.
|
170
|
+
|
171
|
+
|
172
|
+
== Website and Project Home
|
173
|
+
|
174
|
+
* {Project Homepage}[http://code.simonecarletti.com/activerecord-multiconditions]
|
175
|
+
* {At GitHub}[http://github.com/weppos/activerecord-multiconditions/]
|
176
|
+
|
177
|
+
|
178
|
+
== FeedBack and Bug reports
|
179
|
+
|
180
|
+
Feel free to email {Simone Carletti}[mailto:weppos@weppos.net]
|
181
|
+
with any questions or feedback.
|
182
|
+
|
183
|
+
Please submit your bug reports to the Redmine installation for MultiConditions
|
184
|
+
available at http://code.simonecarletti.com/activerecord-multiconditions.
|
185
|
+
|
186
|
+
|
187
|
+
== Changelog
|
188
|
+
|
189
|
+
See CHANGELOG file.
|
data/Rakefile
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'echoe'
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + "/lib")
|
5
|
+
require 'multi_conditions'
|
6
|
+
|
7
|
+
|
8
|
+
# Common package properties
|
9
|
+
PKG_NAME = ENV['PKG_NAME'] || ActiveRecord::Base::MultiConditions::GEM
|
10
|
+
PKG_VERSION = ENV['PKG_VERSION'] || ActiveRecord::Base::MultiConditions::VERSION
|
11
|
+
PKG_SUMMARY = "An ActiveRecord plugin for dealing with complex search :conditions."
|
12
|
+
PKG_FILES = FileList.new("{lib,test}/**/*.rb") do |fl|
|
13
|
+
fl.exclude 'TODO'
|
14
|
+
fl.include %w(README.rdoc README CHANGELOG MIT-LICENSE)
|
15
|
+
fl.include %w(Rakefile setup.rb)
|
16
|
+
end
|
17
|
+
RUBYFORGE_PROJECT = 'activerecord-multiconditions'
|
18
|
+
|
19
|
+
if ENV['SNAPSHOT'].to_i == 1
|
20
|
+
PKG_VERSION << "." << Time.now.utc.strftime("%Y%m%d%H%M%S")
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
Echoe.new(PKG_NAME, PKG_VERSION) do |p|
|
25
|
+
p.author = "Simone Carletti"
|
26
|
+
p.email = "weppos@weppos.net"
|
27
|
+
p.summary = PKG_SUMMARY
|
28
|
+
p.description = <<-EOF
|
29
|
+
MultiConditions is a simple ActiveRecord plugin \
|
30
|
+
for storing ActiveRecord query conditions and make complex queries painless.
|
31
|
+
EOF
|
32
|
+
p.url = "http://code.simonecarletti.com/activerecord-multiconditions"
|
33
|
+
|
34
|
+
p.version = PKG_VERSION
|
35
|
+
p.changes = ''
|
36
|
+
|
37
|
+
p.dependencies = ['activerecord >=2.0.0']
|
38
|
+
p.rcov_options = ["-xRakefile"]
|
39
|
+
|
40
|
+
p.need_zip = true
|
41
|
+
p.include_rakefile = true
|
42
|
+
|
43
|
+
p.project = RUBYFORGE_PROJECT
|
44
|
+
|
45
|
+
p.rdoc_pattern = /^(lib|CHANGELOG|MIT\-LICENSE|README)/
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
begin
|
50
|
+
require 'code_statistics'
|
51
|
+
desc "Show library's code statistics"
|
52
|
+
task :stats do
|
53
|
+
CodeStatistics.new(["MultiConditions", "lib"],
|
54
|
+
["Tests", "test"]).to_s
|
55
|
+
end
|
56
|
+
rescue LoadError
|
57
|
+
puts "CodeStatistics (Rails) is not available"
|
58
|
+
end
|
data/TODO
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
|
2
|
+
# Gem::Specification for Activerecord-multiconditions-0.1.0
|
3
|
+
# Originally generated by Echoe
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = %q{activerecord-multiconditions}
|
7
|
+
s.version = "0.1.0"
|
8
|
+
|
9
|
+
s.specification_version = 2 if s.respond_to? :specification_version=
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.authors = ["Simone Carletti"]
|
13
|
+
s.date = %q{2008-06-10}
|
14
|
+
s.description = %q{MultiConditions is a simple ActiveRecord plugin for storing ActiveRecord query conditions and make complex queries painless.}
|
15
|
+
s.email = %q{weppos@weppos.net}
|
16
|
+
s.extra_rdoc_files = ["CHANGELOG", "lib/multi_conditions.rb", "MIT-LICENSE", "README"]
|
17
|
+
s.files = ["CHANGELOG", "lib/multi_conditions.rb", "MIT-LICENSE", "Rakefile", "README", "setup.rb", "test/db/test.sqlite3", "test/helper.rb", "test/helper_database.rb", "test/test_all.rb", "test/unit/multi_conditions_test.rb", "TODO", "Manifest", "activerecord-multiconditions.gemspec"]
|
18
|
+
s.has_rdoc = true
|
19
|
+
s.homepage = %q{http://code.simonecarletti.com/activerecord-multiconditions}
|
20
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Activerecord-multiconditions", "--main", "README"]
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
s.rubyforge_project = %q{activerecord-multiconditions}
|
23
|
+
s.rubygems_version = %q{1.1.1}
|
24
|
+
s.summary = %q{An ActiveRecord plugin for dealing with complex search :conditions.}
|
25
|
+
s.test_files = ["test/test_all.rb"]
|
26
|
+
|
27
|
+
s.add_dependency(%q<activerecord>, [">= 2.0.0"])
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
# # Original Rakefile source (requires the Echoe gem):
|
32
|
+
#
|
33
|
+
# require 'rubygems'
|
34
|
+
# require 'echoe'
|
35
|
+
#
|
36
|
+
# $LOAD_PATH.unshift(File.dirname(__FILE__) + "/lib")
|
37
|
+
# require 'multi_conditions'
|
38
|
+
#
|
39
|
+
#
|
40
|
+
# # Common package properties
|
41
|
+
# PKG_NAME = ENV['PKG_NAME'] || ActiveRecord::Base::MultiConditions::GEM
|
42
|
+
# PKG_VERSION = ENV['PKG_VERSION'] || ActiveRecord::Base::MultiConditions::VERSION
|
43
|
+
# PKG_SUMMARY = "An ActiveRecord plugin for dealing with complex search :conditions."
|
44
|
+
# PKG_FILES = FileList.new("{lib,test}/**/*.rb") do |fl|
|
45
|
+
# fl.exclude 'TODO'
|
46
|
+
# fl.include %w(README.rdoc README CHANGELOG MIT-LICENSE)
|
47
|
+
# fl.include %w(Rakefile setup.rb)
|
48
|
+
# end
|
49
|
+
# RUBYFORGE_PROJECT = 'activerecord-multiconditions'
|
50
|
+
#
|
51
|
+
# if ENV['SNAPSHOT'].to_i == 1
|
52
|
+
# PKG_VERSION << "." << Time.now.utc.strftime("%Y%m%d%H%M%S")
|
53
|
+
# end
|
54
|
+
#
|
55
|
+
#
|
56
|
+
# Echoe.new(PKG_NAME, PKG_VERSION) do |p|
|
57
|
+
# p.author = "Simone Carletti"
|
58
|
+
# p.email = "weppos@weppos.net"
|
59
|
+
# p.summary = PKG_SUMMARY
|
60
|
+
# p.description = <<-EOF
|
61
|
+
# MultiConditions is a simple ActiveRecord plugin \
|
62
|
+
# for storing ActiveRecord query conditions and make complex queries painless.
|
63
|
+
# EOF
|
64
|
+
# p.url = "http://code.simonecarletti.com/activerecord-multiconditions"
|
65
|
+
#
|
66
|
+
# p.version = PKG_VERSION
|
67
|
+
# p.changes = ''
|
68
|
+
#
|
69
|
+
# p.dependencies = ['activerecord >=2.0.0']
|
70
|
+
# p.rcov_options = ["-xRakefile"]
|
71
|
+
#
|
72
|
+
# p.need_zip = true
|
73
|
+
# p.include_rakefile = true
|
74
|
+
#
|
75
|
+
# p.project = RUBYFORGE_PROJECT
|
76
|
+
#
|
77
|
+
# p.rdoc_pattern = /^(lib|CHANGELOG|MIT\-LICENSE|README)/
|
78
|
+
# end
|
79
|
+
#
|
80
|
+
#
|
81
|
+
# begin
|
82
|
+
# require 'code_statistics'
|
83
|
+
# desc "Show library's code statistics"
|
84
|
+
# task :stats do
|
85
|
+
# CodeStatistics.new(["MultiConditions", "lib"],
|
86
|
+
# ["Tests", "test"]).to_s
|
87
|
+
# end
|
88
|
+
# rescue LoadError
|
89
|
+
# puts "CodeStatistics (Rails) is not available"
|
90
|
+
# end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
#
|
2
|
+
# = ActiveRecord::MultiConditions
|
3
|
+
#
|
4
|
+
# An ActiveRecord plugin for dealing with complex search :conditions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# Category:: ActiveRecord
|
8
|
+
# Package:: ActiveRecord::MultiConditions
|
9
|
+
# Author:: Simone Carletti <weppos@weppos.net>
|
10
|
+
#
|
11
|
+
#--
|
12
|
+
# SVN: $Id$
|
13
|
+
#++
|
14
|
+
|
15
|
+
|
16
|
+
module ActiveRecord
|
17
|
+
class Base
|
18
|
+
|
19
|
+
#
|
20
|
+
# = ActiveRecord::MultiConditions
|
21
|
+
#
|
22
|
+
# MultiConditions is a simple ActiveRecord plugin for storing ActiveRecord
|
23
|
+
# query and make complex queries painless.
|
24
|
+
#
|
25
|
+
# This plugin doesn't replace ActiveRecord#with_scope method,
|
26
|
+
# nor the basic :condition usage but extends it with the ability
|
27
|
+
# of storing illimitate conditions in multiple step.
|
28
|
+
#
|
29
|
+
# conditions = MultiConditions.new
|
30
|
+
# # ... do some elaboration
|
31
|
+
# conditions.append_condition(['active = ? AND query LIKE ?', true, '%foo']
|
32
|
+
# # ... other elaboration
|
33
|
+
# conditions.append_condition(['name = ?', 'aname']
|
34
|
+
#
|
35
|
+
# conditions.to_conditions
|
36
|
+
# # => "active = true AND query LIKE '%foo' AND name = 'aname'"
|
37
|
+
#
|
38
|
+
# The MultiConditions object accepts any type of conditions supported by ActiveRecord,
|
39
|
+
# including Strings, Arrays and Hashes, and merges them alltogether
|
40
|
+
# just before sending the final :condition value to ActiveRecord search method.
|
41
|
+
#
|
42
|
+
# conditions = MultiConditions.new
|
43
|
+
# conditions.append_conditions(:foo => 1, :bar => 2)
|
44
|
+
# conditions.append_conditions('active = 1')
|
45
|
+
# conditions.append_conditions(['name LIKE ?', '%foo'])
|
46
|
+
#
|
47
|
+
# conditions.to_conditions
|
48
|
+
# # => 'foo = 1 AND :bar = 2 AND active = 1 AND name LIKE '%foo'
|
49
|
+
#
|
50
|
+
# See ActiveRecord::Base#find documentation for more conditions examples.
|
51
|
+
#
|
52
|
+
#
|
53
|
+
# == Important
|
54
|
+
#
|
55
|
+
# Once loaded, this library become part of ActiveRecord package and
|
56
|
+
# creates its own namespace at ActiveRecord::Base::MultiConditions.
|
57
|
+
#
|
58
|
+
# For various reason, you cannot initialize a new ActiveRecord::Base::MultiConditions
|
59
|
+
# but you *MUST* initialize a MultiConditions instance from a Model.
|
60
|
+
#
|
61
|
+
# # The wrong way
|
62
|
+
# # raises Message: <"undefined method `abstract_class?' for Object:Class">
|
63
|
+
# ActiveRecord::Base::MultiConditions.new
|
64
|
+
#
|
65
|
+
# # The right way
|
66
|
+
# class Model < ActiveRecord::Base
|
67
|
+
#
|
68
|
+
# def a_method()
|
69
|
+
# c = MultiConditions.new
|
70
|
+
# find(:all, :conditions => c.to_conditions)
|
71
|
+
# end
|
72
|
+
#
|
73
|
+
# end
|
74
|
+
#
|
75
|
+
#
|
76
|
+
class MultiConditions
|
77
|
+
|
78
|
+
module Version #:nodoc:
|
79
|
+
MAJOR = 0
|
80
|
+
MINOR = 1
|
81
|
+
TINY = 0
|
82
|
+
|
83
|
+
STRING = [MAJOR, MINOR, TINY].join('.')
|
84
|
+
end
|
85
|
+
|
86
|
+
NAME = 'ActiveRecord::MultiConditions'
|
87
|
+
GEM = 'activerecord-multiconditions'
|
88
|
+
AUTHOR = 'Simone Carletti <weppos@weppos.net>'
|
89
|
+
VERSION = defined?(Version) ? Version::STRING : nil
|
90
|
+
STATUS = 'alpha'
|
91
|
+
BUILD = ''.match(/(\d+)/).to_a.first
|
92
|
+
|
93
|
+
|
94
|
+
# Conditions collection
|
95
|
+
attr_reader :conditions
|
96
|
+
|
97
|
+
#
|
98
|
+
# Creates a new MultiConditions instance and initializes it with +conditions+.
|
99
|
+
#
|
100
|
+
# # empty instance
|
101
|
+
# c = MultiConditions.new
|
102
|
+
#
|
103
|
+
# # new instance with a first value
|
104
|
+
# c = MultiConditions.new(['condition = ?', 'value'])
|
105
|
+
#
|
106
|
+
# # initialization with block
|
107
|
+
# c = MultiConditions.new do |condition|
|
108
|
+
# condition.append_condition('foo = 1')
|
109
|
+
# condition.append_condition('bar = 2')
|
110
|
+
# condition.append_condition(:baz => 3)
|
111
|
+
# end
|
112
|
+
#
|
113
|
+
def initialize(condition = nil, &block) # :yields: self
|
114
|
+
@conditions = []
|
115
|
+
append_condition(condition)
|
116
|
+
yield(self) if block_given?
|
117
|
+
self
|
118
|
+
end
|
119
|
+
|
120
|
+
#
|
121
|
+
# Appends a new condition at the end of condition list.
|
122
|
+
#
|
123
|
+
def append_condition(condition)
|
124
|
+
@conditions.push(prepare_condition(condition)) unless condition.nil?
|
125
|
+
end
|
126
|
+
|
127
|
+
#
|
128
|
+
# Prepends a new condition at the beginning of condition list.
|
129
|
+
#
|
130
|
+
def prepend_condition(condition)
|
131
|
+
@conditions.unshift(prepare_condition(condition)) unless condition.nil?
|
132
|
+
end
|
133
|
+
|
134
|
+
#
|
135
|
+
# Returns a :conditions suitable representation of this object
|
136
|
+
#
|
137
|
+
# c = MultiConditions.new do |condition|
|
138
|
+
# condition.append_condition('foo = 1')
|
139
|
+
# condition.append_condition('bar = 2')
|
140
|
+
# condition.append_condition(:baz => 3)
|
141
|
+
# end
|
142
|
+
#
|
143
|
+
# c.to_conditions
|
144
|
+
# # => 'foo = 1 AND bar = 2 AND baz = 3'
|
145
|
+
#
|
146
|
+
# # Example usage
|
147
|
+
# find(:all, :conditions => c.to_conditions)
|
148
|
+
#
|
149
|
+
def to_conditions
|
150
|
+
@conditions.join(' AND ')
|
151
|
+
end
|
152
|
+
alias :to_s :to_conditions
|
153
|
+
|
154
|
+
|
155
|
+
protected
|
156
|
+
|
157
|
+
# normalize conditions to be stored
|
158
|
+
# for now use active record :sanitize_sql_for_conditions
|
159
|
+
# instead of dealing with custom methods.
|
160
|
+
def prepare_condition(condition)
|
161
|
+
Task.send(:sanitize_sql_for_conditions, condition)
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
end
|