method

attribute

Importance_2
v4.2.7 - Show latest stable - 0 notes - Class: ClassMethods
attribute(name, cast_type, options = {}) public

Defines or overrides a attribute on this model. This allows customization of Active Record’s type casting behavior, as well as adding support for user defined types.

name The name of the methods to define attribute methods for, and the column which this will persist to.

cast_type A type object that contains information about how to type cast the value. See the examples section for more information.

Options

The options hash accepts the following options:

default is the default value that the column should use on a new record.

Examples

The type detected by Active Record can be overridden.

# db/schema.rb
create_table :store_listings, force: true do |t|
  t.decimal :price_in_cents
end

# app/models/store_listing.rb
class StoreListing < ActiveRecord::Base
end

store_listing = StoreListing.new(price_in_cents: '10.1')

# before
store_listing.price_in_cents # => BigDecimal.new(10.1)

class StoreListing < ActiveRecord::Base
  attribute :price_in_cents, Type::Integer.new
end

# after
store_listing.price_in_cents # => 10

Users may also define their own custom types, as long as they respond to the methods defined on the value type. The `type_cast` method on your type object will be called with values both from the database, and from your controllers. See `ActiveRecord::Attributes::Type::Value` for the expected API. It is recommended that your type objects inherit from an existing type, or the base value type.

class MoneyType < ActiveRecord::Type::Integer
  def type_cast(value)
    if value.include?('$')
      price_in_dollars = value.gsub(/\$/, '').to_f
      price_in_dollars * 100
    else
      value.to_i
    end
  end
end

class StoreListing < ActiveRecord::Base
  attribute :price_in_cents, MoneyType.new
end

store_listing = StoreListing.new(price_in_cents: '$10.00')
store_listing.price_in_cents # => 1000
Show source
Register or log in to add new notes.