attribute
- 1.0.0
- 1.1.6
- 1.2.6
- 2.0.3
- 2.1.0
- 2.2.1
- 2.3.8
- 3.0.0
- 3.0.9
- 3.1.0
- 3.2.1
- 3.2.8
- 3.2.13
- 4.0.2
- 4.1.8
- 4.2.1 (0)
- 4.2.7 (0)
- 4.2.9 (0)
- 5.0.0.1 (38)
- 5.1.7 (0)
- 5.2.3 (0)
- 6.0.0 (4)
- 6.1.3.1 (0)
- 6.1.7.7 (0)
- 7.0.0 (0)
- 7.1.3.2 (0)
- 7.1.3.4 (0)
- What's this?
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