Module: ActiveRecord::AttributeMethods::Write

Extended by:
ActiveSupport::Concern
Defined in:
activerecord/lib/active_record/attribute_methods/write.rb

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

WriterMethodCache =
Class.new(AttributeMethodCache) {
  private

  def method_body(method_name, const_name)
    <<-EOMETHOD
    def #{method_name}(value)
      name = ::ActiveRecord::AttributeMethods::AttrNames::ATTR_#{const_name}
      write_attribute(name, value)
    end
    EOMETHOD
  end
}.new

Instance Method Summary collapse

Methods included from ActiveSupport::Concern

append_features, extended, included

Instance Method Details

#write_attribute(attr_name, value) ⇒ Object Also known as: raw_write_attribute

Updates the attribute identified by attr_name with the specified value. Empty strings for fixnum and float columns are turned into nil.



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'activerecord/lib/active_record/attribute_methods/write.rb', line 57

def write_attribute(attr_name, value)
  attr_name = attr_name.to_s
  attr_name = self.class.primary_key if attr_name == 'id' && self.class.primary_key
  @attributes_cache.delete(attr_name)
  column = column_for_attribute(attr_name)

  # If we're dealing with a binary column, write the data to the cache
  # so we don't attempt to typecast multiple times.
  if column && column.binary?
    @attributes_cache[attr_name] = value
  end

  if column || @attributes.has_key?(attr_name)
    @attributes[attr_name] = type_cast_attribute_for_write(column, value)
  else
    raise ActiveModel::MissingAttributeError, "can't write unknown attribute `#{attr_name}'"
  end
end