arel-helpers 2.0.1 → 2.0.2
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.
- checksums.yaml +4 -4
- data/History.txt +3 -0
- data/README.md +1 -1
- data/lib/arel-helpers.rb +14 -0
- data/lib/arel-helpers/ext/collection_proxy.rb +35 -0
- data/lib/arel-helpers/version.rb +1 -1
- data/spec/arel_table_spec.rb +11 -0
- metadata +11 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2f4827c570f384201da3e8d5b4cb4ba128647338
|
4
|
+
data.tar.gz: 41862cd346409a675ce805be9be7b9bf870f1fad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74e3d838e06893f725de391c378367693fb1b6215124eeae4ae0f9357347b044fd35d53eafc38673f0fab9c60c05b340c33d543496eec7be259d6230f20b8f80
|
7
|
+
data.tar.gz: 7aac06ec8e7433ed527cb81ab85aa269affb9bbc760b144565c35f36386d5bfee44264bc7c1e48bb015ca9ff6b36c037c594d06b7b54e84e336caab1f483b1b1
|
data/History.txt
CHANGED
@@ -18,3 +18,6 @@
|
|
18
18
|
|
19
19
|
* Define ArelHelpers.join_association so people can use join_association functionality without relying on autoloading. (@peeja, github issue #8)
|
20
20
|
|
21
|
+
== 2.0.2
|
22
|
+
|
23
|
+
* Fix issue causing CollectionProxy#[] to return Arel::Attribute objects instead of model instances. See https://github.com/camertron/arel-helpers/pull/11
|
data/README.md
CHANGED
@@ -65,7 +65,7 @@ Things start to get messy however if you want to do an outer join instead of the
|
|
65
65
|
Post
|
66
66
|
.joins(
|
67
67
|
Post.arel_table.join(Comments.arel_table, Arel::OuterJoin)
|
68
|
-
.on(Post[:id].eq(
|
68
|
+
.on(Post[:id].eq(Comments[:post_id]))
|
69
69
|
.join_sources
|
70
70
|
)
|
71
71
|
```
|
data/lib/arel-helpers.rb
CHANGED
@@ -2,6 +2,20 @@
|
|
2
2
|
|
3
3
|
require 'active_record'
|
4
4
|
|
5
|
+
begin
|
6
|
+
ar_version = if ActiveRecord::VERSION.const_defined?(:STRING)
|
7
|
+
ActiveRecord::VERSION::STRING
|
8
|
+
else
|
9
|
+
ActiveRecord.version.version
|
10
|
+
end
|
11
|
+
|
12
|
+
if ar_version >= '4.0.0'
|
13
|
+
require 'arel-helpers/ext/collection_proxy'
|
14
|
+
end
|
15
|
+
rescue
|
16
|
+
puts 'ArelHelpers was unable to determine the version of ActiveRecord. You may encounter unexpected behavior.'
|
17
|
+
end
|
18
|
+
|
5
19
|
module ArelHelpers
|
6
20
|
autoload :JoinAssociation, "arel-helpers/join_association"
|
7
21
|
autoload :ArelTable, "arel-helpers/arel_table"
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# ActiveRecord as of version 4.0 defines a CollectionProxy class that
|
4
|
+
# lazily fetches records from the database. If posts has many comments,
|
5
|
+
# then post.comments returns a CollectionProxy that can be iterated over.
|
6
|
+
# A query to fetch the pertinent records isn't fired until the iteration
|
7
|
+
# starts, so post.comments itself isn't enough to cause a trip to the
|
8
|
+
# database.
|
9
|
+
#
|
10
|
+
# ArelHelpers adds a [] method to ActiveRecord::Relation which means it
|
11
|
+
# also adds the same method to CollectionProxy, since CollectionProxy
|
12
|
+
# inherits from Relation. For some reason, CollectionProxy doesn't define
|
13
|
+
# its own [] method but instead lets ActiveRecord's complicated Delegation
|
14
|
+
# module handle calls to it via method_missing. In the post.comments case
|
15
|
+
# illustrated above, a call to [] is handled by this method_missing:
|
16
|
+
# https://github.com/rails/rails/blob/4-1-stable/activerecord/lib/active_record/relation/delegation.rb#L91
|
17
|
+
# Here, @klass refers to the Comment model, which means [] calls on an
|
18
|
+
# instance of CollectionProxy actually get re-routed. Instead of calling
|
19
|
+
# [] on a CollectionProxy like we were expecting, it calls [] on Comment,
|
20
|
+
# and therefore on the mixed-in ArelHelpers::ArelTable. The final result
|
21
|
+
# is that the caller gets back an Arel::Attribute instead of the instance
|
22
|
+
# of Comment they were expecting.
|
23
|
+
#
|
24
|
+
# This "simple" monkey patch defines [] on CollectionProxy so the convoluted
|
25
|
+
# method_missing logic in Delegation doesn't get triggered, and therefore
|
26
|
+
# doesn't end up returning an unexpected Arel::Attribute.
|
27
|
+
module ActiveRecord
|
28
|
+
module Associations
|
29
|
+
class CollectionProxy < Relation
|
30
|
+
def [](index)
|
31
|
+
to_a[index]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/arel-helpers/version.rb
CHANGED
data/spec/arel_table_spec.rb
CHANGED
@@ -10,4 +10,15 @@ describe ArelHelpers::ArelTable do
|
|
10
10
|
post_id.relation.name.should == "posts"
|
11
11
|
end
|
12
12
|
end
|
13
|
+
|
14
|
+
it "should not interfere with associations" do
|
15
|
+
post = Post.create(title: "I'm a little teapot")
|
16
|
+
post.comments[0].should be_nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should allow retrieving associated records" do
|
20
|
+
post = Post.create(title: "I'm a little teapot")
|
21
|
+
comment = post.comments.create
|
22
|
+
post.reload.comments[0].id.should == comment.id
|
23
|
+
end
|
13
24
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arel-helpers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cameron Dutro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -38,23 +38,24 @@ executables: []
|
|
38
38
|
extensions: []
|
39
39
|
extra_rdoc_files: []
|
40
40
|
files:
|
41
|
-
- Gemfile
|
42
|
-
- History.txt
|
43
|
-
- README.md
|
44
|
-
- Rakefile
|
45
|
-
- arel-helpers.gemspec
|
46
|
-
- lib/arel-helpers.rb
|
47
41
|
- lib/arel-helpers/arel_table.rb
|
42
|
+
- lib/arel-helpers/ext/collection_proxy.rb
|
48
43
|
- lib/arel-helpers/join_association.rb
|
49
44
|
- lib/arel-helpers/query_builder.rb
|
50
45
|
- lib/arel-helpers/version.rb
|
46
|
+
- lib/arel-helpers.rb
|
51
47
|
- spec/arel_table_spec.rb
|
52
|
-
- spec/env.rb
|
53
48
|
- spec/env/migrations.rb
|
54
49
|
- spec/env/models.rb
|
50
|
+
- spec/env.rb
|
55
51
|
- spec/join_association_spec.rb
|
56
52
|
- spec/query_builder_spec.rb
|
57
53
|
- spec/spec_helper.rb
|
54
|
+
- Gemfile
|
55
|
+
- History.txt
|
56
|
+
- README.md
|
57
|
+
- Rakefile
|
58
|
+
- arel-helpers.gemspec
|
58
59
|
homepage: http://github.com/camertron
|
59
60
|
licenses: []
|
60
61
|
metadata: {}
|
@@ -74,7 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
75
|
version: '0'
|
75
76
|
requirements: []
|
76
77
|
rubyforge_project:
|
77
|
-
rubygems_version: 2.
|
78
|
+
rubygems_version: 2.0.14
|
78
79
|
signing_key:
|
79
80
|
specification_version: 4
|
80
81
|
summary: Useful tools to help construct database queries with ActiveRecord and Arel.
|