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 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