Module: AttrDefault::InstanceMethods

Defined in:
lib/attr_default.rb

Instance Method Summary collapse

Instance Method Details

#_attr_default_setObject



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

def _attr_default_set
  @_attr_default_set ||= {}
end

#cloneObject



105
106
107
108
109
110
111
112
113
114
115
# File 'lib/attr_default.rb', line 105

def clone
  result = super
  result.created_at = nil unless !result.class.columns_hash.has_key?('created_at')
  result.updated_at = nil unless !result.class.columns_hash.has_key?('updated_at')
  if self.new_record?
    result.instance_variable_set(:@_attr_default_set, self._attr_default_set.dup)
  else
    result.instance_variable_set(:@_attr_defaults_set_from_dup, true)
  end
  result
end

#default_value_for(attr_name) ⇒ Object



46
47
48
49
50
51
52
53
54
55
# File 'lib/attr_default.rb', line 46

def default_value_for(attr_name)
  attr_name = attr_name.to_s
  if self.class._attr_defaults.has_key?(attr_name)
    attr_default = self.class._attr_defaults[attr_name]
    attr_default.is_a?(Proc) ? instance_exec(&attr_default) : (attr_default.dup rescue attr_default)
  else
    column_data = self.class.columns_hash[attr_name] or raise ArgumentError, "#{self.class.name}##{attr_name} not found"
    column_data.default
  end
end

#dupObject



93
94
95
96
97
98
99
100
101
102
103
# File 'lib/attr_default.rb', line 93

def dup
  result = super
  result.created_at = nil unless !result.class.columns_hash.has_key?('created_at')
  result.updated_at = nil unless !result.class.columns_hash.has_key?('updated_at')
  if self.new_record?
    result.instance_variable_set(:@_attr_default_set, self._attr_default_set.dup)
  else
    result.instance_variable_set(:@_attr_defaults_set_from_dup, true)
  end
  result
end

#needs_time_zone_fixup?(attr_name) ⇒ Boolean

Returns:

  • (Boolean)


88
89
90
# File 'lib/attr_default.rb', line 88

def needs_time_zone_fixup?(attr_name)
  self.class.send(:create_time_zone_conversion_attribute?, attr_name, self.class.columns_hash[attr_name])
end

#read_attribute_with_fixups(attr_name) ⇒ Object



65
66
67
68
69
70
71
72
73
# File 'lib/attr_default.rb', line 65

def read_attribute_with_fixups(attr_name)
  if needs_time_zone_fixup?(attr_name)
    cached = @attributes_cache[attr_name] and return cached
    time = read_attribute(attr_name)
    @attributes_cache[attr_name] = time.acts_like?(:time) ? time.in_time_zone : time
  else
    read_attribute(attr_name)
  end
end

#reset_to_default_value(attr_name) ⇒ Object



57
58
59
# File 'lib/attr_default.rb', line 57

def reset_to_default_value(attr_name)
  send("#{attr_name}=", default_value_for(attr_name))
end

#write_attribute_with_fixups(attr_name, args) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/attr_default.rb', line 75

def write_attribute_with_fixups(attr_name, args)
  if needs_time_zone_fixup?(attr_name)
    time = args.first
    unless time.acts_like?(:time)
      time = time.is_a?(String) ? Time.zone.parse(time) : time.to_time rescue time
    end
    time = time.in_time_zone rescue nil if time
    write_attribute(attr_name, time)
  else
    write_attribute(attr_name, *args)
  end
end