activerecord-query 0.1.1 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fdf9b2ff6e244407f97068227e4db1514e85e4a6912178845a12123ad4f952af
4
- data.tar.gz: d0b9acdfb57e77f20e82fe34d36b7158c9ae3c667af80807c1659d78269b5669
3
+ metadata.gz: 1b5d00fe2f0a7e79c492fdc554b5cab1e63f75f0875688a3623a44fb17afcc77
4
+ data.tar.gz: ff43a4a19ad4fc673352eb3fdd846828b7e7b69ff2bc1f5e3ad391971c67a46f
5
5
  SHA512:
6
- metadata.gz: '06893476dc21302c35ca1db93973abaf91dc8e1bcc58a27d4ae83a66a68e9ac7f87d2054f0d9ec31a9d76ec4a638a5b01054877d3d911561916a477d1c010740'
7
- data.tar.gz: 83bd2598980986b424f694b06cf49acf609764030dbb226f326fc34f389143f59d77497d1fde0b7c497881b9cd5c6bcf49bc36c2976c5727bdd7da762cd19b90
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
- #### Joins
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(m, *args, &block)
11
- Column.new(Arel::Table.new(resource), m)
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.to_s.split(/\W+/).compact.each do |resource_name|
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecordQuery
4
- VERSION = "0.1.1"
4
+ VERSION = '0.2.0'
5
5
  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.1.1
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-05 00:00:00.000000000 Z
11
+ date: 2022-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord