better_ar 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,6 @@
1
+ ## 0.0.5
2
+ Implicit joins
3
+
1
4
  ## 0.0.4
2
5
  SQL operator keys must now end with '!'
3
6
 
@@ -15,13 +15,13 @@ Command line:
15
15
 
16
16
  ## Usage
17
17
 
18
- Now a single hash can be passed to ActiveRecord::Base.all that contains not only the where values but also other scopes like 'limit' and 'order'
18
+ Now a single hash can be passed to ActiveRecord::Base.all that contains not only the where values but also other scopes like 'limit' and 'order' and also implicit joins
19
19
 
20
- User.all(:age => 10, :limit! => 5, :offset! => 10, :order! => :name)
20
+ User.all(:age => 10, :limit! => 5, :offset! => 10, :order! => :name, :records => {:name => 'test'})
21
21
 
22
22
  is the same as
23
23
 
24
- User.where(:age => 10).limit(5).offset(10).order(:name)
24
+ User.joins(:records).where(:age => 10, :records => {:name => 'test'}).limit(5).offset(10).order(:name)
25
25
 
26
26
  While this may seem less concise the advantage is being able to dynamically construct the query with a single hash in code.
27
27
 
@@ -1,15 +1,24 @@
1
1
  module BetterAr
2
2
  module ClassMethods
3
3
 
4
- # Breaks down the hash to do a ActiveRecord::Relation query
4
+ # Breaks down the hash to do a {ActiveRecord::Relation} query
5
5
  #
6
- # example: User.all(:age => 10, :limit! => 2, :offset! => 3, :order! => :name)
6
+ # example:
7
+ # User.all(:age => 10, :limit! => 2, :offset! => 3, :order! => :name)
7
8
  #
8
- # is the same as: User.where(:age => 10).limit(2).offset(3).order(:name)
9
+ # is the same as:
10
+ # User.where(:age => 10).limit(2).offset(3).order(:name)
9
11
  #
10
12
  # if the key :conditions is present it will fall back to legacy
11
13
  #
12
- # any key with the '!' at the end will be assumed to be a sql operator. The key should match either an ActiveRecord::Relation instance method or an ARel predicate.
14
+ # any key with the '!' at the end will be assumed to be a sql operator. The key should match either an {ActiveRecord::Relation} instance method or an ARel predicate.
15
+ #
16
+ # Implicit joins are supported.
17
+ # example:
18
+ # User.all(:records => {:name => 'test'})
19
+ #
20
+ # is the same as:
21
+ # User.joins(:records).where(:records => {:name => 'test'})
13
22
  #
14
23
  # @param [Hash]
15
24
  # Optional
@@ -24,6 +33,13 @@ module BetterAr
24
33
  relation = relation.send(predicate.to_s.sub('!',''), value)
25
34
  end
26
35
  end
36
+
37
+ reflect_on_all_associations.map(&:name).each do |name|
38
+ if opts.key?(name)
39
+ relation = relation.joins(name)
40
+ end
41
+ end
42
+
27
43
  relation.where(opts)
28
44
  end
29
45
 
@@ -35,19 +51,20 @@ module BetterAr
35
51
  else
36
52
  relation.all(opts)
37
53
  end
38
-
39
54
  end
40
55
 
41
56
  # Forces a limit of 1 on the collection
42
57
  #
43
- # example: User.first(:age => 10, :name => 'Brian')
58
+ # example:
59
+ # User.first(:age => 10, :name => 'Brian')
44
60
  #
45
- # is the same as: User.where(:age => 10, :name => 'Brian').limit(1).first
61
+ # is the same as:
62
+ # User.where(:age => 10, :name => 'Brian').limit(1).first
46
63
  #
47
64
  # if the key :conditions is present it will fall back to legacy
48
65
  #
49
66
  # @param [Hash]
50
- # Optional follows same convention as .all
67
+ # Optional follows same convention as {#all}
51
68
  # @return [ActiveRecord::Base]
52
69
  def first(opts = {})
53
70
  unless opts.key?(:conditions)
@@ -59,14 +76,16 @@ module BetterAr
59
76
 
60
77
  # Does a count on the query
61
78
  #
62
- # example: User.count(:age => 20)
79
+ # example:
80
+ # User.count(:age => 20)
63
81
  #
64
- # is the same as: User.where(:age => 20).count
82
+ # is the same as:
83
+ # User.where(:age => 20).count
65
84
  #
66
85
  # if the key :conditions is present it will fall back to legacy
67
86
  #
68
87
  # @param [Hash]
69
- # Optional follows same convention as .all
88
+ # Optional follows same convention as {#all}
70
89
  # @return [Integer]
71
90
  def count(opts = {})
72
91
  unless opts.key?(:conditions)
@@ -1,3 +1,3 @@
1
1
  module BetterAr
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -17,7 +17,15 @@ ActiveRecord::Base.establish_connection(
17
17
  )
18
18
 
19
19
  users_table = %{CREATE TABLE users (id INTEGER PRIMARY KEY, age INTEGER, name TEXT);}
20
+ records_table = %{CREATE TABLE records (id INTEGER PRIMARY KEY, user_id INTEGER, name TEXT);}
20
21
  ActiveRecord::Base.connection.execute(users_table)
22
+ ActiveRecord::Base.connection.execute(records_table)
21
23
 
22
- class User < ActiveRecord::Base; end
24
+ class User < ActiveRecord::Base
25
+ has_many :records
26
+ end
27
+
28
+ class Record < ActiveRecord::Base
29
+ belongs_to :user
30
+ end
23
31
 
@@ -17,6 +17,12 @@ describe 'Enhanced Finder Methods' do
17
17
  expected_sql = User.where(:age => 10).limit(1).offset(2).order(:name).to_sql
18
18
  test_sql.must_be_like expected_sql
19
19
  end
20
+
21
+ it 'finds implicit joins by reflection' do
22
+ test_sql = User.all(:records => { :name => 'test' }).to_sql
23
+ expected_sql = User.joins(:records).where(:records => { :name => 'test' }).to_sql
24
+ test_sql.must_be_like expected_sql
25
+ end
20
26
  end
21
27
 
22
28
  describe '.first' do
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 4
9
- version: 0.0.4
8
+ - 5
9
+ version: 0.0.5
10
10
  platform: ruby
11
11
  authors:
12
12
  - Brian Cardarella
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-01-27 00:00:00 -05:00
17
+ date: 2011-02-11 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency