Class: ActiveRecord::Relation

Inherits:
Object
  • Object
show all
Defined in:
lib/pluck_all/models/active_record_extension.rb,
lib/pluck_all/models/active_record_extension.rb

Instance Method Summary collapse

Instance Method Details

#cast_carrier_wave_uploader_url(attributes) ⇒ Object


● Support casting CarrierWave url




81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/pluck_all/models/active_record_extension.rb', line 81

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|
      {}.tap do |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
  end
  return attributes
end

#cast_need_columns(column_names, _klass = nil) ⇒ Object



5
6
7
8
9
# File 'lib/pluck_all/models/active_record_extension.rb', line 5

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

#pluck_all(*column_names, cast_uploader_url: true) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/pluck_all/models/active_record_extension.rb', line 18

def pluck_all(*column_names, cast_uploader_url: true)
  column_names.map!(&to_sql_column_name)
  result = select_all(*column_names)
  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) if cast_uploader_url
    next attributes
  end
end

#select_all(*column_names) ⇒ Object



11
12
13
14
15
# File 'lib/pluck_all/models/active_record_extension.rb', line 11

def select_all(*column_names)
  relation = clone
  relation.select_values = [].freeze # cannot use `unscope(:select)` in Rails 3
  return klass.connection.select_all(relation.select(column_names).to_sql)
end