deep_pluck 0.1.0 → 0.1.1

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
  SHA1:
3
- metadata.gz: b20668dbd7b6878ed071b71534eb5c73facbd2a5
4
- data.tar.gz: d0717078533f829893fd2e22f3331d00b22003c2
3
+ metadata.gz: 02455f382f53378da4401571796aa5f0d200327e
4
+ data.tar.gz: a7ae7dcc3a2e5b38416766ae1ac0564574375660
5
5
  SHA512:
6
- metadata.gz: 72273fc908114709b56b034faf6278684063d5787a84559cc7fe5353ce913fca112c6f4efc315156154a99a43518e301b87f40bea294f99aa87d5b1116d64d3d
7
- data.tar.gz: b2c45401285b2f407194506dd26be1aa9327ace23bf2e16b7acef734391d34533177e897fd599eb2e5a93115e32ebff15b6f2bd67e0774206073a7700c9cc4fc
6
+ metadata.gz: db336700568010031bf5a22f4eb98dcee584b5f631d2d74c78d251a811ac4f857f5b3b09093df3350b0d74732ecf19fa54c0b012de3fbd8a6503ef9c7f9f0573
7
+ data.tar.gz: 9c273df567114544e2b356dbc67d80bf1839e41dd0617983bcde494ed98b8cbabf547057970997a58a5fc63b61b7db0bf7f9c0a9d8217260326f717aad7eb46d
@@ -16,12 +16,18 @@ module DeepPluck
16
16
  def get_reflect(association_key)
17
17
  @relation.klass.reflect_on_association(association_key.to_sym) #add to_sym since rails 3 only support symbol
18
18
  end
19
- def get_foreign_key(reflect, reverse = false)
19
+ def get_foreign_key(reflect, reverse: false, with_table_name: false)
20
20
  if reflect.options[:through] and reverse #reverse = parent
21
- return "#{reflect.options[:through]}.#{reflect.chain.last.foreign_key}"
21
+ chain_reflect = reflect.chain.last
22
+ table_name = chain_reflect.table_name
23
+ key = chain_reflect.foreign_key
24
+ else
25
+ return (reflect.belongs_to? ? reflect.active_record.primary_key : reflect.foreign_key) if reverse
26
+ table_name = reflect.active_record.table_name
27
+ key = (reflect.belongs_to? ? reflect.foreign_key : reflect.active_record.primary_key)
22
28
  end
23
- return (reflect.belongs_to? ? reflect.active_record.primary_key : reflect.foreign_key) if reverse
24
- return (reflect.belongs_to? ? reflect.foreign_key : reflect.active_record.primary_key)
29
+ return key if !with_table_name
30
+ return "#{table_name}.#{key}"
25
31
  end
26
32
  #---------------------------------------
27
33
  # Contruction OPs
@@ -54,8 +60,8 @@ module DeepPluck
54
60
  private
55
61
  def do_query(parent, reflect, relation)
56
62
  relation = relation.joins(reflect.options[:through]) if reflect.options[:through]
57
- parent_key = get_foreign_key(reflect, false)
58
- relation_key = get_foreign_key(reflect, true)
63
+ parent_key = get_foreign_key(reflect)
64
+ relation_key = get_foreign_key(reflect, reverse: true, with_table_name: true)
59
65
  ids = parent.map{|s| s[parent_key]}
60
66
  ids.uniq!
61
67
  ids.compact!
@@ -66,16 +72,23 @@ module DeepPluck
66
72
  reflect = get_reflect(children_store_name)
67
73
  if reflect.belongs_to? #Child.where(:id => parent.pluck(:child_id))
68
74
  children = model.load_data{|relation| do_query(parent, reflect, relation) }
69
- children_hash = Hash[children.map{|s| [s["id"], s]}]
75
+ children_hash = children.map{|s| [s["id"], s]}.to_h
70
76
  parent.each{|s|
71
77
  next if (id = s[reflect.foreign_key]) == nil
72
78
  s[children_store_name] = children_hash[id]
73
79
  }
74
80
  else #Child.where(:parent_id => parent.pluck(:id))
75
- parent.each{|s| s[children_store_name] = [] } if reflect.collection?
76
- parent_hash = Hash[parent.map{|s| [s["id"], s]}]
81
+ parent_hash = {}
82
+ parent.each do |model_hash|
83
+ key = model_hash['id']
84
+ if reflect.collection?
85
+ array = (parent_hash[key] ? parent_hash[key][children_store_name] : []) #hare the children if id is duplicated
86
+ model_hash[children_store_name] = array
87
+ end
88
+ parent_hash[key] = model_hash
89
+ end
77
90
  children = model.load_data{|relation| do_query(parent, reflect, relation) }
78
- foreign_key = get_foreign_key(reflect, true).sub(/\w+\./, '') #user_achievements.user_id => user_id
91
+ foreign_key = get_foreign_key(reflect, reverse: true)
79
92
  children.each{|s|
80
93
  next if (id = s[foreign_key]) == nil
81
94
  if reflect.collection?
@@ -89,14 +102,14 @@ module DeepPluck
89
102
  end
90
103
  public
91
104
  def load_data
92
- prev_need_columns = @parent_model.get_foreign_key(@parent_model.get_reflect(@parent_association_key), true) if @parent_model
93
- next_need_columns = @associations.map{|key, _| get_foreign_key(get_reflect(key)) }.uniq
105
+ prev_need_columns = @parent_model.get_foreign_key(@parent_model.get_reflect(@parent_association_key), reverse: true, with_table_name: true) if @parent_model
106
+ next_need_columns = @associations.map{|key, _| get_foreign_key(get_reflect(key), with_table_name: true) }.uniq
94
107
  all_need_columns = [*prev_need_columns, *next_need_columns, *@need_columns].uniq
95
108
  @relation = yield(@relation) if block_given?
96
109
  @data = @relation.pluck_all(*all_need_columns)
97
110
  if @data.size != 0
98
111
  @extra_columns = all_need_columns - @need_columns #for delete_extra_column_data!
99
- @extra_columns.map!{|s| s.sub(/\w+\./, '')} #user_achievements.user_id => user_id
112
+ @extra_columns.map!{|s| s.gsub(/\w*[^\w]/, '')} #user_achievements.user_id => user_id
100
113
  @associations.each do |key, model|
101
114
  set_includes_data(@data, key, model)
102
115
  end
@@ -1,3 +1,3 @@
1
1
  module DeepPluck
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deep_pluck
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - khiav reoy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-15 00:00:00.000000000 Z
11
+ date: 2017-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -138,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
138
  version: '0'
139
139
  requirements: []
140
140
  rubyforge_project:
141
- rubygems_version: 2.6.8
141
+ rubygems_version: 2.4.8
142
142
  signing_key:
143
143
  specification_version: 4
144
144
  summary: Use deep_pluck as a shortcut to select one or more attributes and include