activerecord-query 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +28 -1
- data/lib/active_record_query/concerns/joinable.rb +23 -3
- data/lib/active_record_query/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b5d00fe2f0a7e79c492fdc554b5cab1e63f75f0875688a3623a44fb17afcc77
|
4
|
+
data.tar.gz: ff43a4a19ad4fc673352eb3fdd846828b7e7b69ff2bc1f5e3ad391971c67a46f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f36bd0c44715ef2070ee62bf5e13bccf094ba2c84aee6a95136f5f9820d75200b4b2229ce54e2ae2718f602a9d07a0acba62b56b2c0a9db9df98d52a5888868
|
7
|
+
data.tar.gz: 39dfe1d3d50d9a9c0dc5ce1ee41f1cca4e26176d5ae90d9703131041cc9ff3727fb8c8b5a9e13dbdd736d823cc3661284c79b0f2c93d5809afd4ac749bf7bc97
|
data/README.md
CHANGED
@@ -273,7 +273,7 @@ class PostQuery < ActiveRecordQuery::Base
|
|
273
273
|
end
|
274
274
|
```
|
275
275
|
|
276
|
-
####
|
276
|
+
#### Inner Join
|
277
277
|
The `join` method defines one/many relationships with the current resource (`from` state).
|
278
278
|
The following example has a Post and Author models, the way we define a join is the same as
|
279
279
|
defining a `joins` on activerecord (check the active record querying doc.).
|
@@ -300,6 +300,33 @@ class PostQuery < ActiveRecordQuery::Base
|
|
300
300
|
end
|
301
301
|
```
|
302
302
|
|
303
|
+
#### Left Outer Join
|
304
|
+
The `left_outer_join` method defines one/many relationships with the current resource (`from` state).
|
305
|
+
The following example has a Post and Author models, the way we define a left outer join is the same as
|
306
|
+
defining a `left_outer_joins` on activerecord (check the active record querying doc.).
|
307
|
+
Right after defined the join, a new method will be available for retrieve the columns
|
308
|
+
from the new resource, the `posts` method on the example bellow. Every relationship listed in
|
309
|
+
the args will be converted to a method with the same name.
|
310
|
+
```ruby
|
311
|
+
# models
|
312
|
+
class Post < ActiveRecord::Base
|
313
|
+
belongs_to :author
|
314
|
+
end
|
315
|
+
|
316
|
+
class Author < ActiveRecord::Base
|
317
|
+
has_many :posts
|
318
|
+
end
|
319
|
+
|
320
|
+
# query
|
321
|
+
class PostQuery < ActiveRecordQuery::Base
|
322
|
+
from Author
|
323
|
+
left_outer_join :posts
|
324
|
+
|
325
|
+
# the `posts` helper will be available
|
326
|
+
where posts.title == 'A title'
|
327
|
+
end
|
328
|
+
```
|
329
|
+
|
303
330
|
|
304
331
|
#### Group by
|
305
332
|
To apply a GROUP BY clause to the query, you can use the `group_by` method.
|
@@ -1,14 +1,16 @@
|
|
1
1
|
module ActiveRecordQuery
|
2
|
+
# The module defines the join and left_outer_join macros.
|
2
3
|
module Joinable
|
3
4
|
extend ActiveSupport::Concern
|
4
5
|
|
6
|
+
# The object holds the columns called from a joined resource.
|
5
7
|
class JoinedResource
|
6
8
|
def initialize(resource)
|
7
9
|
@resource = resource
|
8
10
|
end
|
9
11
|
|
10
|
-
def method_missing(
|
11
|
-
Column.new(Arel::Table.new(resource),
|
12
|
+
def method_missing(method_name, *_args, &block)
|
13
|
+
Column.new(Arel::Table.new(resource), method_name)
|
12
14
|
end
|
13
15
|
|
14
16
|
private
|
@@ -20,7 +22,16 @@ module ActiveRecordQuery
|
|
20
22
|
def join(*args)
|
21
23
|
arg_stacker = ArgumentStacker.new(self, :join)
|
22
24
|
arg_stacker.add(args)
|
23
|
-
args
|
25
|
+
define_table_resources_from_join(args)
|
26
|
+
end
|
27
|
+
|
28
|
+
def left_outer_join(*args)
|
29
|
+
ArgumentStacker.new(self, :left_outer_join).add(args)
|
30
|
+
define_table_resources_from_join(args)
|
31
|
+
end
|
32
|
+
|
33
|
+
def define_table_resources_from_join(join_args)
|
34
|
+
join_args.to_s.split(/\W+/).compact.each do |resource_name|
|
24
35
|
define_singleton_method(resource_name) do
|
25
36
|
JoinedResource.new(resource_name.pluralize)
|
26
37
|
end
|
@@ -30,6 +41,7 @@ module ActiveRecordQuery
|
|
30
41
|
|
31
42
|
included do
|
32
43
|
add_feature :build_joins
|
44
|
+
add_feature :build_left_outer_joins
|
33
45
|
end
|
34
46
|
|
35
47
|
def build_joins(scope)
|
@@ -39,5 +51,13 @@ module ActiveRecordQuery
|
|
39
51
|
end
|
40
52
|
scope
|
41
53
|
end
|
54
|
+
|
55
|
+
def build_left_outer_joins(scope)
|
56
|
+
arg_stacker = ArgumentStacker.new(self, :left_outer_join)
|
57
|
+
arg_stacker.list.each do |join_params|
|
58
|
+
scope = scope.left_outer_joins(join_params)
|
59
|
+
end
|
60
|
+
scope
|
61
|
+
end
|
42
62
|
end
|
43
63
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-query
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcos Felipe
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-11-
|
11
|
+
date: 2022-11-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|