deep_pluck 0.1.0 → 0.1.1

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