lib/pluck_all.rb in pluck_all-2.0.1 vs lib/pluck_all.rb in pluck_all-2.0.2
- old
+ new
@@ -1,132 +1,4 @@
# frozen_string_literal: true
-require 'pluck_all/version'
-require 'active_record'
-begin
- require 'mongoid'
- require 'pluck_all/mongoid_pluck_all'
-rescue LoadError, Gem::LoadError
+require "pluck_all/version"
+require "pluck_all/hooks"
-end
-
-class ActiveRecord::Base
- if !defined?(attribute_types) && defined?(column_types)
- class << self
- # column_types was changed to attribute_types in Rails 5
- alias_method :attribute_types, :column_types
- end
- end
-end
-
-module ActiveRecord
- [
- *([Type::Value, Type::Integer, Type::Serialized] if defined?(Type::Value)),
- *([Enum::EnumType] if defined?(Enum::EnumType)),
- ].each do |s|
- s.class_eval do
- if !method_defined?(:deserialize) && method_defined?(:type_cast_from_database)
- # column_types was changed to attribute_types in Rails 5
- alias deserialize type_cast_from_database
- end
- end
- end
-end
-
-class ActiveRecord::Relation
- if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new('4.0.0')
- def pluck_all(*args)
- result = select_all(*args)
- result.map! do |attributes| # This map! behaves different to array#map!
- initialized_attributes = klass.initialize_attributes(attributes)
- attributes.each do |key, attribute|
- attributes[key] = klass.type_cast_attribute(key, initialized_attributes) #TODO 現在AS過後的type cast會有一點問題
- end
- cast_carrier_wave_uploader_url(attributes)
- end
- end
- else
- def pluck_all(*args)
- result = select_all(*args)
- attribute_types = klass.attribute_types
- result.map! do |attributes| # This map! behaves different to array#map!
- attributes.each do |key, attribute|
- attributes[key] = result.send(:column_type, key, attribute_types).deserialize(attribute) #TODO 現在AS過後的type cast會有一點問題,但似乎原生的pluck也有此問題
- end
- cast_carrier_wave_uploader_url(attributes)
- end
- end
- end
-
- def cast_need_columns(column_names, _klass = nil)
- @pluck_all_cast_need_columns = column_names.map(&:to_s)
- @pluck_all_cast_klass = _klass
- return self
- end
-
- private
-
- def select_all(*args)
- args.map! do |column_name|
- if column_name.is_a?(Symbol) && column_names.include?(column_name.to_s)
- "#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(column_name)}"
- else
- column_name.to_s
- end
- end
- relation = clone
- return klass.connection.select_all(relation.select(args).to_sql)
- #return klass.connection.select_all(relation.arel)
- end
-
- # ----------------------------------------------------------------
- # ● Support casting CarrierWave url
- # ----------------------------------------------------------------
- def cast_carrier_wave_uploader_url(attributes)
- if defined?(CarrierWave) && klass.respond_to?(:uploaders)
- @pluck_all_cast_klass ||= klass
- @pluck_all_uploaders ||= @pluck_all_cast_klass.uploaders.select{|key, uploader| attributes.key?(key.to_s) }
- @pluck_all_uploaders.each do |key, uploader|
- hash = {}
- @pluck_all_cast_need_columns.each{|k| hash[k] = attributes[k] } if @pluck_all_cast_need_columns
- obj = @pluck_all_cast_klass.new(hash)
- obj[key] = attributes[key_s = key.to_s]
- #https://github.com/carrierwaveuploader/carrierwave/blob/87c37b706c560de6d01816f9ebaa15ce1c51ed58/lib/carrierwave/mount.rb#L142
- attributes[key_s] = obj.send(key)
- end
- end
- return attributes
- end
-end
-
-class ActiveRecord::Relation
- if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new('4.0.2')
- def pluck_array(*args)
- return pluck_all(*args).map{|hash|
- result = hash.values #P.S. 這裡是相信ruby 1.9以後,hash.values的順序跟insert的順序一樣。
- next (result.one? ? result.first : result)
- }
- end
- else
- alias_method :pluck_array, :pluck if not method_defined?(:pluck_array)
- end
-end
-
-
-class << ActiveRecord::Base
- def cast_need_columns(*args)
- where(nil).cast_need_columns(*args)
- end
-
- def pluck_all(*args)
- where(nil).pluck_all(*args)
- end
-
- def pluck_array(*args)
- where(nil).pluck_array(*args)
- end
-end
-
-module ActiveRecord::NullRelation
- def pluck_all(*args)
- []
- end
-end