Class: PluckMap::Attribute

Inherits:
Object
  • Object
show all
Defined in:
lib/pluck_map/attribute.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id, model, options = {}) ⇒ Attribute

Returns a new instance of Attribute.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/pluck_map/attribute.rb', line 6

def initialize(id, model, options={})
  @id = id
  @model = model
  @selects = Array(options.fetch(:select, id))
  @name = options.fetch(:as, id)
  @block = options[:map]

  if options.key? :value
    @value = options[:value]
    @selects = []
  else
    raise ArgumentError, "You must select at least one column" if selects.empty?
    raise ArgumentError, "You must define a block if you are going to select " <<
      "more than one expression from the database" if selects.length > 1 && !block

    @selects = @selects.map do |select|
      if select.is_a?(String) && !select.is_a?(Arel::Nodes::SqlLiteral)
        puts "DEPRECATION WARNING: Passing raw SQL as a String to :select is deprecated. Known-safe values can be passed by wrapping them in Arel.sql()."
        Arel.sql(select)
      else
        select
      end
    end
  end
end

Instance Attribute Details

#blockObject (readonly)

Returns the value of attribute block.



3
4
5
# File 'lib/pluck_map/attribute.rb', line 3

def block
  @block
end

#idObject (readonly)

Returns the value of attribute id.



3
4
5
# File 'lib/pluck_map/attribute.rb', line 3

def id
  @id
end

#indexesObject

Returns the value of attribute indexes.



4
5
6
# File 'lib/pluck_map/attribute.rb', line 4

def indexes
  @indexes
end

#modelObject (readonly)

Returns the value of attribute model.



3
4
5
# File 'lib/pluck_map/attribute.rb', line 3

def model
  @model
end

#nameObject (readonly)

Returns the value of attribute name.



3
4
5
# File 'lib/pluck_map/attribute.rb', line 3

def name
  @name
end

#selectsObject (readonly)

Returns the value of attribute selects.



3
4
5
# File 'lib/pluck_map/attribute.rb', line 3

def selects
  @selects
end

#valueObject (readonly)

Returns the value of attribute value.



3
4
5
# File 'lib/pluck_map/attribute.rb', line 3

def value
  @value
end

Instance Method Details

#==(other) ⇒ Object



65
66
67
68
# File 'lib/pluck_map/attribute.rb', line 65

def ==(other)
  return false if self.class != other.class
  self.values == other.values
end

#apply(object) ⇒ Object



32
33
34
# File 'lib/pluck_map/attribute.rb', line 32

def apply(object)
  block.call(*object)
end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


74
75
76
77
78
# File 'lib/pluck_map/attribute.rb', line 74

def eql?(other)
  return true if self.equal?(other)
  return false if self.class != other.class
  self.values.eql?(other.values)
end

#hashObject



70
71
72
# File 'lib/pluck_map/attribute.rb', line 70

def hash
  values.hash
end

#to_ruby(selects = nil) ⇒ Object

When the PluckMapPresenter performs the query, it will receive an array of rows. Each row will itself be an array of values.

This method constructs a Ruby expression that will extract the appropriate values from each row that correspond to this Attribute.



47
48
49
50
51
52
53
54
55
56
57
# File 'lib/pluck_map/attribute.rb', line 47

def to_ruby(selects = nil)
  if selects
    puts "DEPRECATION WARNING: PluckMap::Attribute#to_ruby no longer requires an argument. Replace `attribute.to_ruby(keys)` with `attribute.to_ruby`."
  end

  return @value.inspect if defined?(@value)
  return "values[#{indexes[0]}]" if indexes.length == 1 && !block
  ruby = "values.values_at(#{indexes.join(", ")})"
  ruby = "invoke(:\"#{id}\", #{ruby})" if block
  ruby
end

#valuesObject



61
62
63
# File 'lib/pluck_map/attribute.rb', line 61

def values
  [id, selects, name, value, block]
end

#will_map?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/pluck_map/attribute.rb', line 36

def will_map?
  !block.nil?
end