polymorphic_join 0.2.1 → 0.2.2

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
- SHA256:
3
- metadata.gz: 9b703f8ff1b5289d2747b1459e5740c4b8d6a67065f1472cdf6d7a684ce2a142
4
- data.tar.gz: 74fbc141a9bb1b3371e504260ef483848e9988cfb1fdd9e49073a2909f322e56
2
+ SHA1:
3
+ metadata.gz: b2e3c19213a3b9fbe21bfa6d1ea920f31c9f5def
4
+ data.tar.gz: 5bf97916ff403fc3a719da1711efdce1bd2adc1d
5
5
  SHA512:
6
- metadata.gz: 425c0fd60d0d5bfcdf7e478d55230be5891561efb8081d17d3ba480e1435617677ac063951583d5fe3a91fa090a2e9db38c4649ec8a39071c2bb3a70c7657e1c
7
- data.tar.gz: 89a3ae135b7aacb3503ba41307509fe579a37b8b1d2e19d9591e1dedfba8101644d8c598296f9cf931e5750d008d059fd9c1607d19b26d0942b002efafd21df2
6
+ metadata.gz: dd699d99211940f5f9fc54e350b33b69bd98a60ea880a84034717dcd24b2634327d8c7f5c7113d20f995958f4c91633187f0c6ad2ede6d4531d7a0d721d931ce
7
+ data.tar.gz: 2be3693618f439c047a23f578c205d21becd4f2cc2bcc694a263a428cffb7ab0780bdae58a8d641df022fe01fc115187f6c4dcb49adf59d18e59fe2c3b232833
data/README.md CHANGED
@@ -7,7 +7,7 @@ Rails does not include a polymorphic join by default but this gem would help you
7
7
  Add this line to your application's Gemfile:
8
8
 
9
9
  ```ruby
10
- gem 'polymorphic_join', '~> 0.2.0'
10
+ gem 'polymorphic_join', '~> 0.2.1'
11
11
  ```
12
12
 
13
13
  And then execute:
@@ -57,6 +57,23 @@ Notification
57
57
  .order('notifiables.common_attribute ASC')
58
58
  ```
59
59
 
60
+ Or if you want to map back certain column
61
+
62
+ ```rb
63
+ Notification
64
+ .ref_polymorphic(
65
+ :notifiable,
66
+ [
67
+ :comments,
68
+ {
69
+ uploads: { title: 'content' }
70
+ }
71
+ ]
72
+ )
73
+ .where('notifiables.common_attribute' => 'test')
74
+ .order('notifiables.common_attribute ASC')
75
+ ```
76
+
60
77
  ## Development
61
78
 
62
79
  After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -1,3 +1,3 @@
1
1
  module PolymorphicJoin
2
- VERSION = "0.2.1"
2
+ VERSION = '0.2.2'.freeze
3
3
  end
@@ -1,4 +1,4 @@
1
- # rubocop:disable BlockLength, AbcSize, Style/Documentation, MethodLength
1
+ # rubocop:disable MethodLength, AbcSize
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'polymorphic_join/version'
@@ -10,8 +10,73 @@ module PolymorphicJoin
10
10
  end
11
11
 
12
12
  module ClassMethods
13
+ def query_ref_polymorphic(type, refs)
14
+ polymorphic = if refs.nil?
15
+ {
16
+ refs: retrieve_all_polymorphic_types(type),
17
+ map_columns: {}
18
+ }
19
+ else
20
+ process_input_refs(refs)
21
+ end
13
22
 
14
- private
23
+ columns =
24
+ polymorphic[:refs]
25
+ .first
26
+ .to_s
27
+ .classify
28
+ .constantize
29
+ .column_names
30
+
31
+ polymorphic[:refs].each do |p|
32
+ columns &= p.to_s.classify.constantize.column_names
33
+ end
34
+
35
+ polymorphic[:map_columns].values.each do |value|
36
+ columns += value.values
37
+ end
38
+
39
+ columns.uniq!
40
+
41
+ selectable_columns = {}
42
+ types = type.to_s.pluralize
43
+ polymorphic[:refs].each do |p|
44
+ map_columns = polymorphic[:map_columns][p] || {}
45
+ selectable_columns[p] = []
46
+
47
+ p.to_s.classify.constantize.column_names.each do |column_name|
48
+ if (alias_name = map_columns[column_name.to_sym]).present?
49
+ selectable_columns[p] <<
50
+ "#{types}.#{column_name} AS #{alias_name}"
51
+ elsif columns.index(column_name)
52
+ selectable_columns[p] <<
53
+ "#{types}.#{column_name}"
54
+ end
55
+ end
56
+ end
57
+
58
+ table = arel_table
59
+ joins_statements = polymorphic[:refs].map do |join_type|
60
+ join_table =
61
+ join_type.to_s.classify.constantize.arel_table.alias(types)
62
+ arel_table
63
+ .project(*(selectable_columns[join_type]))
64
+ .join(
65
+ join_table, Arel::Nodes::InnerJoin
66
+ )
67
+ .on(
68
+ table["#{type}_type".to_sym]
69
+ .eq(join_type.to_s.classify)
70
+ .and(
71
+ table["#{type}_id".to_sym].eq(join_table[:id])
72
+ )
73
+ )
74
+ end
75
+
76
+ polymorphic_union_scope(types, *joins_statements)
77
+ end
78
+
79
+ protected
15
80
 
16
81
  def polymorphic_union_scope(types, *scopes)
17
82
  union = scopes[0]
@@ -28,52 +93,35 @@ module PolymorphicJoin
28
93
  end
29
94
 
30
95
  def retrieve_all_polymorphic_types(type)
31
- distinct.pluck("#{type}_type").collect do |x|
96
+ distinct.pluck("#{type}_type").collect do |x|
32
97
  x.underscore.tableize.to_sym
33
98
  end
34
99
  end
35
100
 
36
- def add_ref_polymorphic_scope
37
- scope :ref_polymorphic, lambda { |type, refs = nil|
38
- polymorphic = if refs.nil?
39
- retrieve_all_polymorphic_types(type)
40
- else
41
- refs
42
- end
43
- columns = polymorphic.first.to_s.classify.constantize.column_names
44
- polymorphic.each do |p|
45
- columns &= p.to_s.classify.constantize.column_names
46
- end
47
-
48
- types = type.to_s.pluralize
49
-
50
- columns -= column_names
51
- selectable_columns = []
52
- columns.each do |column|
53
- selectable_columns << "#{types}.#{column}"
54
- end
101
+ def process_input_refs(refs)
102
+ poly_refs = []
103
+ refs.each do |ref|
104
+ poly_refs << (ref.is_a?(Symbol) ? ref : ref.keys.first)
105
+ end
55
106
 
56
- table = arel_table
57
- joins_statements = polymorphic.map do |join_type|
58
- join_table =
59
- join_type.to_s.classify.constantize.arel_table.alias(types)
60
- arel_table
61
- .project(table[Arel.star], *selectable_columns)
62
- .join(
63
- join_table, Arel::Nodes::InnerJoin
64
- )
65
- .on(
66
- table["#{type}_type".to_sym]
67
- .eq(join_type.to_s.classify)
68
- .and(
69
- table["#{type}_id".to_sym].eq(join_table[:id])
70
- )
71
- )
107
+ puts refs.inspect
108
+ {
109
+ refs: poly_refs,
110
+ map_columns: refs.each_with_object({}) do |el, hash|
111
+ if el.is_a?(Symbol)
112
+ hash[el] = {}
113
+ else
114
+ hash[el.keys.first] = el[el.keys.first]
115
+ end
72
116
  end
117
+ }
118
+ end
73
119
 
74
- polymorphic_union_scope(types, *joins_statements)
120
+ def add_ref_polymorphic_scope
121
+ scope :ref_polymorphic, lambda { |type, refs = nil|
122
+ query_ref_polymorphic(type, refs)
75
123
  }
76
124
  end
77
125
  end
78
126
  end
79
- # rubocop:enable all
127
+ # rubocop:disable all
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polymorphic_join
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Huynh
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-04-14 00:00:00.000000000 Z
11
+ date: 2019-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -76,7 +76,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0'
78
78
  requirements: []
79
- rubygems_version: 3.0.3
79
+ rubyforge_project:
80
+ rubygems_version: 2.6.13
80
81
  signing_key:
81
82
  specification_version: 4
82
83
  summary: This gem is used to do polymorphic join