ambition 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -158,6 +158,10 @@ still query through ActiveRecord just fine.
158
158
  User.select { |m| m.name == 'jon' }.sort_by { |m| -m.age }
159
159
  "SELECT * FROM users WHERE users.`name` = 'jon' ORDER BY users.age DESC"
160
160
 
161
+ User.select { |m| m.name == 'jon' }.sort_by { |m| -m.profiles.title }
162
+ "SELECT users.`id` AS t0_r0, ... FROM users LEFT OUTER JOIN profiles ON profiles.user_id = users.id
163
+ WHERE (users.`name` = 'jon') ORDER BY profiles.title DESC"
164
+
161
165
  User.select { |m| m.name == 'jon' }.sort_by { rand }
162
166
  "SELECT * FROM users WHERE users.`name` = 'jon' ORDER BY RAND()"
163
167
 
@@ -175,4 +179,4 @@ Found a bug? Sweet. Add it at the Lighthouse: http://err.lighthouseapp.com/pro
175
179
 
176
180
  Feature requests are welcome.
177
181
 
178
- * Chris Wanstrath [ chris@ozmm.org ]
182
+ * Chris Wanstrath [ chris@ozmm.org ]
data/Rakefile CHANGED
@@ -8,7 +8,7 @@ begin
8
8
  ENV['RUBY_FLAGS'] = ""
9
9
  require 'echoe'
10
10
 
11
- Echoe.new('ambition', '0.1.1') do |p|
11
+ Echoe.new('ambition', '0.1.2') do |p|
12
12
  p.rubyforge_name = 'err'
13
13
  p.summary = "Ambition builds SQL from plain jane Ruby."
14
14
  p.description = "Ambition builds SQL from plain jane Ruby."
@@ -1,15 +1,16 @@
1
1
  module Ambition
2
2
  module Order
3
3
  def sort_by(&block)
4
- query_context.add OrderProcessor.new(table_name, block)
4
+ query_context.add OrderProcessor.new(self, block)
5
5
  end
6
6
  end
7
7
 
8
8
  class OrderProcessor < Processor
9
- def initialize(table_name, block)
9
+ def initialize(owner, block)
10
10
  super()
11
11
  @receiver = nil
12
- @table_name = table_name
12
+ @owner = owner
13
+ @table_name = owner.table_name
13
14
  @block = block
14
15
  @key = :order
15
16
  end
@@ -45,7 +46,7 @@ module Ambition
45
46
  when :__send__
46
47
  "#{@table_name}.#{eval('to_s', @block)}"
47
48
  else
48
- "#{@table_name}.#{method}"
49
+ extract_includes(receiver, method) || "#{@table_name}.#{method}"
49
50
  end
50
51
  end
51
52
  end
@@ -4,7 +4,8 @@ module Ambition
4
4
  class Processor < SexpProcessor
5
5
  include ActiveRecord::ConnectionAdapters::Quoting
6
6
 
7
- attr_reader :key, :join_string, :prefix
7
+ attr_reader :key, :join_string, :prefix, :includes
8
+
8
9
 
9
10
  def initialize
10
11
  super()
@@ -13,6 +14,7 @@ module Ambition
13
14
  @auto_shift_type = true
14
15
  @warn_on_default = false
15
16
  @default_method = :process_error
17
+ @includes = []
16
18
  end
17
19
 
18
20
  ##
@@ -50,5 +52,16 @@ module Ambition
50
52
  else ActiveRecord::Base.connection.quote(value) rescue quote(value)
51
53
  end
52
54
  end
55
+
56
+ def extract_includes(receiver, method)
57
+ return unless receiver.first == :call && receiver[1].last == @receiver
58
+
59
+ if reflection = @owner.reflections[receiver.last]
60
+ @includes << reflection.name unless @includes.include? reflection.name
61
+ "#{reflection.table_name}.#{method}"
62
+ else
63
+ raise "No reflection `#{receiver.last}' found on #{@owner}"
64
+ end
65
+ end
53
66
  end
54
67
  end
@@ -10,8 +10,6 @@ module Ambition
10
10
  end
11
11
 
12
12
  class WhereProcessor < Processor
13
- attr_reader :includes
14
-
15
13
  def initialize(owner, block)
16
14
  super()
17
15
  @receiver = nil
@@ -19,7 +17,6 @@ module Ambition
19
17
  @table_name = owner.table_name
20
18
  @block = block
21
19
  @key = :conditions
22
- @includes = []
23
20
  end
24
21
 
25
22
  ##
@@ -138,20 +135,7 @@ module Ambition
138
135
  when '!~'
139
136
  "#{process(receiver)} NOT LIKE #{process(other)}"
140
137
  else
141
- build_condition(receiver, method, other)
142
- end
143
- end
144
-
145
- def build_condition(receiver, method, other)
146
- if receiver.first == :call && receiver[1].last == @receiver
147
- if reflection = @owner.reflections[receiver.last]
148
- @includes << reflection.name unless @includes.include? reflection.name
149
- "#{reflection.table_name}.#{method}"
150
- else
151
- raise "No reflection `#{receiver.last}' found on #{@owner}"
152
- end
153
- else
154
- "#{process(receiver)}.`#{method}` #{process(other)}"
138
+ extract_includes(receiver, method) || "#{process(receiver)}.`#{method}` #{process(other)}"
155
139
  end
156
140
  end
157
141
  end
data/test/join_test.rb CHANGED
@@ -29,4 +29,20 @@ context "Joins" do
29
29
  sql = User.select { |m| m.liquor.brand == 'Jack' }
30
30
  should.raise { sql.to_hash }
31
31
  end
32
+
33
+ specify "in order" do
34
+ sql = User.sort_by { |m| m.ideas.title }
35
+ sql.to_hash.should == {
36
+ :order => "ideas.title",
37
+ :include => [:ideas]
38
+ }
39
+ end
40
+
41
+ specify "in a more complex order" do
42
+ sql = User.sort_by { |m| [ m.ideas.title, -m.invites.email ] }
43
+ sql.to_hash.should == {
44
+ :order => "ideas.title, invites.email DESC",
45
+ :include => [:ideas, :invites]
46
+ }
47
+ end
32
48
  end
metadata CHANGED
@@ -3,7 +3,7 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: ambition
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.1
6
+ version: 0.1.2
7
7
  date: 2007-08-30 00:00:00 -07:00
8
8
  summary: Ambition builds SQL from plain jane Ruby.
9
9
  require_paths: