pluck_all 2.0.1 → 2.2.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.
@@ -1,28 +1,73 @@
1
1
  sudo: false
2
- env:
3
- global:
4
- - CC_TEST_REPORTER_ID=db72eba1ff8fb1329dae5fb9b9dcd234243899d7a464ceb374e14a05ead27b7c
5
2
  language: ruby
6
3
  rvm:
7
4
  - 2.2
8
- - 2.3
5
+ - 2.6
6
+ - 2.7
9
7
  services:
10
8
  - mongodb
9
+ env:
10
+ global:
11
+ - CC_TEST_REPORTER_ID=db72eba1ff8fb1329dae5fb9b9dcd234243899d7a464ceb374e14a05ead27b7c
12
+ matrix:
13
+ - ORM_TYPE=ACTIVE_RECORD
14
+ - ORM_TYPE=MONGOID
11
15
  gemfile:
12
- - gemfiles/no_mongoid.gemfile
13
- - gemfiles/3.2.gemfile
14
- - gemfiles/4.2.gemfile
15
- - gemfiles/5.0.gemfile
16
- - gemfiles/5.1.gemfile
17
- - gemfiles/5.2.gemfile
16
+ - gemfiles/active_record_32.gemfile
17
+ - gemfiles/active_record_42.gemfile
18
+ - gemfiles/active_record_50.gemfile
19
+ - gemfiles/active_record_51.gemfile
20
+ - gemfiles/active_record_52.gemfile
21
+ - gemfiles/active_record_60.gemfile
22
+ - gemfiles/active_record_61.gemfile
23
+ - gemfiles/mongoid_54.gemfile
24
+ - gemfiles/mongoid_64.gemfile
25
+ - gemfiles/mongoid_70.gemfile
26
+ matrix:
27
+ exclude:
28
+ - gemfile: gemfiles/active_record_32.gemfile
29
+ rvm: 2.6
30
+ - gemfile: gemfiles/active_record_32.gemfile
31
+ rvm: 2.7
32
+ - gemfile: gemfiles/active_record_32.gemfile
33
+ env: ORM_TYPE=MONGOID
34
+ - gemfile: gemfiles/active_record_42.gemfile
35
+ rvm: 2.7
36
+ - gemfile: gemfiles/active_record_42.gemfile
37
+ env: ORM_TYPE=MONGOID
38
+ - gemfile: gemfiles/active_record_50.gemfile
39
+ env: ORM_TYPE=MONGOID
40
+ - gemfile: gemfiles/active_record_51.gemfile
41
+ env: ORM_TYPE=MONGOID
42
+ - gemfile: gemfiles/active_record_52.gemfile
43
+ env: ORM_TYPE=MONGOID
44
+ - gemfile: gemfiles/active_record_60.gemfile
45
+ rvm: 2.2
46
+ - gemfile: gemfiles/active_record_60.gemfile
47
+ env: ORM_TYPE=MONGOID
48
+ - gemfile: gemfiles/active_record_61.gemfile
49
+ rvm: 2.2
50
+ - gemfile: gemfiles/active_record_61.gemfile
51
+ env: ORM_TYPE=MONGOID
52
+ - gemfile: gemfiles/mongoid_54.gemfile
53
+ rvm: 2.7
54
+ - gemfile: gemfiles/mongoid_54.gemfile
55
+ env: ORM_TYPE=ACTIVE_RECORD
56
+ - gemfile: gemfiles/mongoid_64.gemfile
57
+ env: ORM_TYPE=ACTIVE_RECORD
58
+ - gemfile: gemfiles/mongoid_70.gemfile
59
+ env: ORM_TYPE=ACTIVE_RECORD
18
60
  before_install:
19
- - gem install bundler
20
- - gem update --system
61
+ - if `ruby -e 'exit(RUBY_VERSION.to_f < 2.7)'`; then
62
+ gem i rubygems-update -v '< 3' && update_rubygems;
63
+ gem install bundler -v '< 2';
64
+ fi
21
65
  - gem --version
22
66
  - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
23
67
  - chmod +x ./cc-test-reporter
24
68
  - ./cc-test-reporter before-build
25
69
  script:
26
- - bundle exec rake test
70
+ - if [ "$ORM_TYPE" = "ACTIVE_RECORD" ]; then bundle exec rake test_active_record; fi
71
+ - if [ "$ORM_TYPE" = "MONGOID" ]; then bundle exec rake test_mongoid; fi
27
72
  after_script:
28
73
  - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
@@ -1,5 +1,32 @@
1
1
  ## Change Log
2
2
 
3
+ ### [v2.1.0](https://github.com/khiav223577/pluck_all/compare/v2.0.4...v2.1.0) 2020/10/19
4
+ - [#47](https://github.com/khiav223577/pluck_all/pull/47) Use instantiate method to initialize model without calling callbacks (@khiav223577)
5
+ - [#45](https://github.com/khiav223577/pluck_all/pull/45) Support Ruby 2.7 (@khiav223577)
6
+ - [#44](https://github.com/khiav223577/pluck_all/pull/44) Move `require` from begin..rescue block for better debug message (@khiav223577)
7
+ - [#43](https://github.com/khiav223577/pluck_all/pull/43) Use rails_compatibility to get attribute_types for better compatibility (@khiav223577)
8
+ - [#41](https://github.com/khiav223577/pluck_all/pull/41) Support Rails 6.0 (@khiav223577)
9
+
10
+ ### [v2.0.4](https://github.com/khiav223577/pluck_all/compare/v2.0.3...v2.0.4) 2019/04/04
11
+ - [#40](https://github.com/khiav223577/pluck_all/pull/40) Fix: inconsistent with pluck when having `select` on relation (@khiav223577)
12
+ - [#39](https://github.com/khiav223577/pluck_all/pull/39) Fix: undefined local variable or method `construct_relation_for_association_calculations` in Rails 5.2.2.1 (@MasashiYokota)
13
+ - [#36](https://github.com/khiav223577/pluck_all/pull/36) Fix: broken test cases after bundler 2.0 was released (@khiav223577)
14
+ - [#35](https://github.com/khiav223577/pluck_all/pull/35) refactor #test_pluck_with_includes (@khiav223577)
15
+ - [#34](https://github.com/khiav223577/pluck_all/pull/34) Provide Arel support as well (@snkashis)
16
+ - [#33](https://github.com/khiav223577/pluck_all/pull/33) Fix gemfile path in bin/setup (@snkashis)
17
+ - [#32](https://github.com/khiav223577/pluck_all/pull/32) Move patches into separate files (@khiav223577)
18
+
19
+ ### [v2.0.3](https://github.com/khiav223577/pluck_all/compare/v2.0.2...v2.0.3) 2018/07/19
20
+ - [#30](https://github.com/khiav223577/pluck_all/pull/30) Fix: includes + pluck_all results in strange output (@khiav223577)
21
+
22
+ ### [v2.0.2](https://github.com/khiav223577/pluck_all/compare/v2.0.1...v2.0.2) 2018/06/29
23
+ - [#28](https://github.com/khiav223577/pluck_all/pull/28) Fix test cases and the result format may be wrong when plucking multiple columns with nil value may (@khiav223577)
24
+ - [#27](https://github.com/khiav223577/pluck_all/pull/27) [Feature] Mongoid Hooks And Tests Separation (@berniechiu)
25
+ - [#26](https://github.com/khiav223577/pluck_all/pull/26) [FIX] Wrong Module Skipped (@berniechiu)
26
+
27
+ ### [v2.0.1](https://github.com/khiav223577/pluck_all/compare/v2.0.0...v2.0.1) 2018/05/27
28
+ - [#25](https://github.com/khiav223577/pluck_all/pull/25) Fix that project without mongoid will raise LoadError (@khiav223577)
29
+
3
30
  ### [v2.0.0](https://github.com/khiav223577/pluck_all/compare/v1.2.4...v2.0.0) 2018/05/27
4
31
  - [#24](https://github.com/khiav223577/pluck_all/pull/24) Support Mongoid! (@khiav223577)
5
32
  - [#23](https://github.com/khiav223577/pluck_all/pull/23) Refactoring Coding Style (@khiav223577)
@@ -38,6 +65,6 @@
38
65
  ### [v1.1.0](https://github.com/khiav223577/pluck_all/compare/v1.0.1...v1.1.0) 2016/12/21
39
66
  - [#3](https://github.com/khiav223577/pluck_all/pull/3) Feature/pluck array (@khiav223577)
40
67
 
41
- ### v1.0.1 2016/12/20
68
+ ### [v1.0.1](https://github.com/khiav223577/pluck_all/compare/v1.0.0...v1.0.1) 2016/12/20
42
69
  - [#2](https://github.com/khiav223577/pluck_all/pull/2) test with multiple rails version (@khiav223577)
43
70
  - [#1](https://github.com/khiav223577/pluck_all/pull/1) add basic test cases (@khiav223577)
data/README.md CHANGED
@@ -6,15 +6,17 @@
6
6
  [![Code Climate](https://codeclimate.com/github/khiav223577/pluck_all/badges/gpa.svg)](https://codeclimate.com/github/khiav223577/pluck_all)
7
7
  [![Test Coverage](https://codeclimate.com/github/khiav223577/pluck_all/badges/coverage.svg)](https://codeclimate.com/github/khiav223577/pluck_all/coverage)
8
8
 
9
- Pluck multiple columns/attributes in Rails 3, 4, 5, and can return data as hash instead of only array.
9
+ Pluck multiple columns/attributes in Rails 3, 4, 5, 6, and can return data as hash instead of only array. Also supports `Mongoid`.
10
10
 
11
- This Gem stands on the shoulders of this article: [Plucking Multiple Columns in Rails 3](http://meltingice.net/2013/06/11/pluck-multiple-columns-rails/).
11
+ This Gem stands on the shoulders of this article: [Plucking Multiple Columns in Rails 3](https://meltingice.dev/2013/06/11/pluck-multiple-columns-rails/).
12
12
  And modified to support not only Rail 3.
13
13
 
14
14
  If you have a Rails 3 project, and want to pluck not only one column,
15
- feel free to use this gem and no need to worry about upgrading to Rails 4, 5 in the future will break this.
16
-
15
+ feel free to use this gem and no need to worry about upgrading to Rails 4, 5, 6 in the future will break this.
17
16
 
17
+ ## Supports
18
+ - Ruby 2.2 ~ 2.7
19
+ - Rails 3.2, 4.2, 5.0, 5.1, 5.2, 6.0, 6.1
18
20
 
19
21
  ## Installation
20
22
 
@@ -36,7 +38,7 @@ Or install it yourself as:
36
38
 
37
39
  ### pluck to array
38
40
 
39
- Behaves the same as the Rails 4 pluck, but you can use it in Rails 3
41
+ Behaves the same as `#pluck` method, but you can use it to pluck multiple columns in Rails 3
40
42
 
41
43
  ```rb
42
44
  User.where('id < 3').pluck_array(:id, :account)
@@ -45,12 +47,15 @@ User.where('id < 3').pluck_array(:id, :account)
45
47
 
46
48
  ### pluck to hash
47
49
 
48
- Similar to `pluck_array`, but return hash instead.
50
+ Similar to `#pluck` method, but return array of hashes instead.
49
51
 
50
52
  ```rb
51
53
  User.where('id < 3').pluck_all(:id, :account)
52
54
  # => [{"id"=>1, "account"=>"account1"}, {"id"=>2, "account"=>"account2"}]
53
55
 
56
+ User.where('id < 3').pluck_all(:id, 'account AS name')
57
+ # => [{"id"=>1, "name"=>"account1"}, {"id"=>2, "name"=>"account2"}]
58
+
54
59
  User.where('id < 3').pluck_all('id, account AS name')
55
60
  # => [{"id"=>1, "name"=>"account1"}, {"id"=>2, "name"=>"account2"}]
56
61
  ```
@@ -85,18 +90,50 @@ select + map 10.530000 0.660000 11.190000 ( 12.550974)
85
90
  select + as_json 49.040000 1.120000 50.160000 ( 55.417534)
86
91
  pluck_all 3.310000 0.100000 3.410000 ( 3.527775)
87
92
  ```
93
+ Test by `benchmark-ips` and `limit 100` in each iteration:
94
+ ```
95
+ Warming up --------------------------------------
96
+ map 1.000 i/100ms
97
+ select + map 28.000 i/100ms
98
+ select + as_json 7.000 i/100ms
99
+ pluck_all 54.000 i/100ms
100
+ Calculating -------------------------------------
101
+ map 14.230 (± 0.0%) i/s - 72.000 in 5.065349s
102
+ select + map 281.638 (± 4.6%) i/s - 1.428k in 5.081216s
103
+ select + as_json 73.241 (± 4.1%) i/s - 371.000 in 5.076235s
104
+ pluck_all 539.057 (± 6.7%) i/s - 2.700k in 5.034858s
105
+
106
+ Comparison:
107
+ pluck_all: 539.1 i/s
108
+ select + map: 281.6 i/s - 1.91x slower
109
+ select + as_json: 73.2 i/s - 7.36x slower
110
+ map: 14.2 i/s - 37.88x slower
111
+ ```
88
112
  [test script](https://github.com/khiav223577/pluck_all/issues/18)
89
113
 
90
114
  ### Compare with [pluck_to_hash](https://github.com/girishso/pluck_to_hash) gem
91
115
 
92
- `pluck_all` has better performace since it uses raw `hash` data from `ActiveRecord::Base.connection.select_all`, while `pluck_to_hash` uses `pluck` method, which calls `ActiveRecord::Base.connection.select_all` and transfers the raw `hash` data to `array` format, and then transfer the data to `hash` format again. The following benchmark test uses same datebase as above.
116
+ `pluck_all` has better performace since it uses raw `hash` data from `ActiveRecord::Base.connection.select_all`, while `pluck_to_hash` uses `pluck` method, which calls `ActiveRecord::Base.connection.select_all` and transfers the raw `hash` data to `array` format, and then transfer the data to `hash` format again. The following benchmark shows the performance difference:
93
117
 
94
118
  ```rb
95
119
                                        user     system     total       real
96
120
  pluck_to_hash 2.960000 0.130000 3.090000 ( 3.421640)
97
121
  pluck_all 2.160000 0.120000 2.280000 ( 2.605118)
98
122
  ```
99
- [test script](https://github.com/khiav223577/pluck_all/issues/18#issuecomment-325407080)
123
+ Tested by `benchmark-ips` and `limit 1000` in each iteration:
124
+ ```
125
+ Warming up --------------------------------------
126
+ pluck_to_hash 7.000 i/100ms
127
+ pluck_all 9.000 i/100ms
128
+ Calculating -------------------------------------
129
+ pluck_to_hash 84.526 (± 4.7%) i/s - 427.000 in 5.065792s
130
+ pluck_all 95.133 (± 4.2%) i/s - 477.000 in 5.021555s
131
+
132
+ Comparison:
133
+ pluck_all: 95.1 i/s
134
+ pluck_to_hash: 84.5 i/s - 1.13x slower
135
+ ```
136
+ See the [test script](https://github.com/khiav223577/pluck_all/issues/18#issuecomment-325407080) for more details.
100
137
 
101
138
  ## Other Support
102
139
  ### Support Pluck Carrierwave Uploader (if you use carrierwave)
@@ -110,12 +147,12 @@ User.where(xxx).map(&:profile_pic)
110
147
  If the uploader use something like: `model.id`, `model.name`
111
148
  You may have to send these columns manually:
112
149
  ```rb
113
- User.where(xxx).cast_need_columns(%i(id, name)).pluck_all(:id, :name, :profile_pic).map{|s| s['profile_pic'] }
150
+ User.where(xxx).cast_need_columns(%i[id name]).pluck_all(:id, :name, :profile_pic).map{|s| s['profile_pic'] }
114
151
  ```
115
152
 
116
153
  ## Development
117
154
 
118
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
155
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test_active_record` or `rake test_mongoid` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
119
156
 
120
157
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
121
158
 
data/Rakefile CHANGED
@@ -1,10 +1,22 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
3
 
4
4
  Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
5
+ t.libs << 'test'
6
+ t.libs << 'lib'
7
7
  t.test_files = FileList['test/**/*_test.rb']
8
8
  end
9
9
 
10
- task :default => :test
10
+ Rake::TestTask.new(:test_active_record) do |t|
11
+ t.libs << 'test'
12
+ t.libs << 'lib'
13
+ t.test_files = FileList['test/active_record/**/*_test.rb']
14
+ end
15
+
16
+ Rake::TestTask.new(:test_mongoid) do |t|
17
+ t.libs << 'test'
18
+ t.libs << 'lib'
19
+ t.test_files = FileList['test/mongoid/**/*_test.rb']
20
+ end
21
+
22
+ task default: :test
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "pluck_all"
3
+ require 'bundler/setup'
4
+ require 'pluck_all'
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +10,5 @@ require "pluck_all"
10
10
  # require "pry"
11
11
  # Pry.start
12
12
 
13
- require "irb"
13
+ require 'irb'
14
14
  IRB.start
data/bin/setup CHANGED
@@ -3,6 +3,6 @@ set -euo pipefail
3
3
  IFS=$'\n\t'
4
4
  set -vx
5
5
 
6
- bundle install --gemfile=gemfiles/4.2.gemfile
6
+ bundle install --gemfile=gemfiles/active_record_42.gemfile
7
7
 
8
8
  # Do any other automated setup that you need to do here
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'sqlite3', '~> 1.3.0'
6
+ gem 'activerecord', '~> 3.2.0'
7
+ gem 'carrierwave', '~> 0.11.0'
8
+
9
+ group :test do
10
+ gem 'simplecov'
11
+ end
12
+
13
+ gemspec path: '../'
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'sqlite3', '~> 1.3.0'
6
+ gem 'activerecord', '~> 4.2.0'
7
+ gem 'carrierwave', '~> 0.11.0'
8
+
9
+ group :test do
10
+ gem 'simplecov'
11
+ end
12
+
13
+ gemspec path: '../'
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'sqlite3', '~> 1.3.0'
6
+ gem 'activerecord', '~> 5.0.0'
7
+ gem 'carrierwave', '~> 0.11.0'
8
+
9
+ group :test do
10
+ gem 'simplecov'
11
+ end
12
+
13
+ gemspec path: '../'
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'sqlite3', '~> 1.3.0'
6
+ gem 'activerecord', '~> 5.1.0'
7
+ gem 'carrierwave', '~> 0.11.0'
8
+
9
+ group :test do
10
+ gem 'simplecov'
11
+ end
12
+
13
+ gemspec path: '../'
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'sqlite3', '~> 1.3.0'
6
+ gem 'activerecord', '~> 5.2.0'
7
+ gem 'carrierwave', '~> 0.11.0'
8
+
9
+ group :test do
10
+ gem 'simplecov'
11
+ end
12
+
13
+ gemspec path: '../'
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'sqlite3', '~> 1.4.1'
6
+ gem 'activerecord', '~> 6.0.0'
7
+ gem 'carrierwave', '~> 0.11.0'
8
+
9
+ group :test do
10
+ gem 'simplecov'
11
+ end
12
+
13
+ gemspec path: '../'
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'sqlite3', '~> 1.4.1'
6
+ gem 'activerecord', '~> 6.1.0'
7
+ gem 'carrierwave', '~> 0.11.0'
8
+
9
+ group :test do
10
+ gem 'simplecov'
11
+ end
12
+
13
+ gemspec path: '../'
@@ -2,12 +2,10 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in pluck_all.gemspec
4
4
 
5
- gem "activerecord", "~> 5.2.0"
5
+ gem 'mongoid', '~> 5.4.0'
6
6
 
7
7
  group :test do
8
- gem "simplecov"
9
- gem 'carrierwave', '~> 0.11.0'
8
+ gem 'simplecov'
10
9
  end
11
10
 
12
- gemspec :path => "../"
13
-
11
+ gemspec path: '../'
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'mongoid', '~> 6.4.0'
6
+
7
+ group :test do
8
+ gem 'simplecov'
9
+ end
10
+
11
+ gemspec path: '../'
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'mongoid', '~> 7.0.0'
6
+
7
+ group :test do
8
+ gem 'simplecov'
9
+ end
10
+
11
+ gemspec path: '../'
@@ -1,132 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
  require 'pluck_all/version'
3
- require 'active_record'
4
- begin
5
- require 'mongoid'
6
- require 'pluck_all/mongoid_pluck_all'
7
- rescue LoadError, Gem::LoadError
8
-
9
- end
10
-
11
- class ActiveRecord::Base
12
- if !defined?(attribute_types) && defined?(column_types)
13
- class << self
14
- # column_types was changed to attribute_types in Rails 5
15
- alias_method :attribute_types, :column_types
16
- end
17
- end
18
- end
19
-
20
- module ActiveRecord
21
- [
22
- *([Type::Value, Type::Integer, Type::Serialized] if defined?(Type::Value)),
23
- *([Enum::EnumType] if defined?(Enum::EnumType)),
24
- ].each do |s|
25
- s.class_eval do
26
- if !method_defined?(:deserialize) && method_defined?(:type_cast_from_database)
27
- # column_types was changed to attribute_types in Rails 5
28
- alias deserialize type_cast_from_database
29
- end
30
- end
31
- end
32
- end
33
-
34
- class ActiveRecord::Relation
35
- if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new('4.0.0')
36
- def pluck_all(*args)
37
- result = select_all(*args)
38
- result.map! do |attributes| # This map! behaves different to array#map!
39
- initialized_attributes = klass.initialize_attributes(attributes)
40
- attributes.each do |key, attribute|
41
- attributes[key] = klass.type_cast_attribute(key, initialized_attributes) #TODO 現在AS過後的type cast會有一點問題
42
- end
43
- cast_carrier_wave_uploader_url(attributes)
44
- end
45
- end
46
- else
47
- def pluck_all(*args)
48
- result = select_all(*args)
49
- attribute_types = klass.attribute_types
50
- result.map! do |attributes| # This map! behaves different to array#map!
51
- attributes.each do |key, attribute|
52
- attributes[key] = result.send(:column_type, key, attribute_types).deserialize(attribute) #TODO 現在AS過後的type cast會有一點問題,但似乎原生的pluck也有此問題
53
- end
54
- cast_carrier_wave_uploader_url(attributes)
55
- end
56
- end
57
- end
58
-
59
- def cast_need_columns(column_names, _klass = nil)
60
- @pluck_all_cast_need_columns = column_names.map(&:to_s)
61
- @pluck_all_cast_klass = _klass
62
- return self
63
- end
64
-
65
- private
66
-
67
- def select_all(*args)
68
- args.map! do |column_name|
69
- if column_name.is_a?(Symbol) && column_names.include?(column_name.to_s)
70
- "#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(column_name)}"
71
- else
72
- column_name.to_s
73
- end
74
- end
75
- relation = clone
76
- return klass.connection.select_all(relation.select(args).to_sql)
77
- #return klass.connection.select_all(relation.arel)
78
- end
79
-
80
- # ----------------------------------------------------------------
81
- # ● Support casting CarrierWave url
82
- # ----------------------------------------------------------------
83
- def cast_carrier_wave_uploader_url(attributes)
84
- if defined?(CarrierWave) && klass.respond_to?(:uploaders)
85
- @pluck_all_cast_klass ||= klass
86
- @pluck_all_uploaders ||= @pluck_all_cast_klass.uploaders.select{|key, uploader| attributes.key?(key.to_s) }
87
- @pluck_all_uploaders.each do |key, uploader|
88
- hash = {}
89
- @pluck_all_cast_need_columns.each{|k| hash[k] = attributes[k] } if @pluck_all_cast_need_columns
90
- obj = @pluck_all_cast_klass.new(hash)
91
- obj[key] = attributes[key_s = key.to_s]
92
- #https://github.com/carrierwaveuploader/carrierwave/blob/87c37b706c560de6d01816f9ebaa15ce1c51ed58/lib/carrierwave/mount.rb#L142
93
- attributes[key_s] = obj.send(key)
94
- end
95
- end
96
- return attributes
97
- end
98
- end
99
-
100
- class ActiveRecord::Relation
101
- if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new('4.0.2')
102
- def pluck_array(*args)
103
- return pluck_all(*args).map{|hash|
104
- result = hash.values #P.S. 這裡是相信ruby 1.9以後,hash.values的順序跟insert的順序一樣。
105
- next (result.one? ? result.first : result)
106
- }
107
- end
108
- else
109
- alias_method :pluck_array, :pluck if not method_defined?(:pluck_array)
110
- end
111
- end
112
-
113
-
114
- class << ActiveRecord::Base
115
- def cast_need_columns(*args)
116
- where(nil).cast_need_columns(*args)
117
- end
118
-
119
- def pluck_all(*args)
120
- where(nil).pluck_all(*args)
121
- end
122
-
123
- def pluck_array(*args)
124
- where(nil).pluck_array(*args)
125
- end
126
- end
127
-
128
- module ActiveRecord::NullRelation
129
- def pluck_all(*args)
130
- []
131
- end
132
- end
3
+ require 'pluck_all/hooks'