Allow specifying a default value in overloaded properties
This commit is contained in:
parent
8c77b0a086
commit
5aa1f5d399
@ -14,6 +14,17 @@ module ClassMethods
|
||||
# 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 overriden.
|
||||
@ -62,11 +73,11 @@ module ClassMethods
|
||||
#
|
||||
# store_listing = StoreListing.new(price_in_cents: '$10.00')
|
||||
# store_listing.price_in_cents # => 1000
|
||||
def property(name, cast_type)
|
||||
def property(name, cast_type, options = {})
|
||||
name = name.to_s
|
||||
clear_properties_cache
|
||||
# Assign a new hash to ensure that subclasses do not share a hash
|
||||
self.user_provided_columns = user_provided_columns.merge(name => connection.new_column(name, nil, cast_type))
|
||||
self.user_provided_columns = user_provided_columns.merge(name => connection.new_column(name, options[:default], cast_type))
|
||||
end
|
||||
|
||||
# Returns an array of column objects for the table associated with this class.
|
||||
|
@ -4,6 +4,7 @@ class OverloadedType < ActiveRecord::Base
|
||||
property :overloaded_float, Type::Integer.new
|
||||
property :overloaded_string_with_limit, Type::String.new(limit: 50)
|
||||
property :non_existent_decimal, Type::Decimal.new
|
||||
property :string_with_default, Type::String.new, default: 'the overloaded default'
|
||||
end
|
||||
|
||||
class ChildOfOverloadedType < OverloadedType
|
||||
@ -62,12 +63,12 @@ def test_nonexistent_property
|
||||
end
|
||||
end
|
||||
|
||||
def test_overloaded_properties_have_no_default
|
||||
def test_changing_defaults
|
||||
data = OverloadedType.new
|
||||
unoverloaded_data = UnoverloadedType.new
|
||||
|
||||
assert_nil data.overloaded_float
|
||||
assert unoverloaded_data.overloaded_float
|
||||
assert_equal 'the overloaded default', data.string_with_default
|
||||
assert_equal 'the original default', unoverloaded_data.string_with_default
|
||||
end
|
||||
|
||||
def test_children_inherit_custom_properties
|
||||
@ -84,7 +85,7 @@ def test_children_can_override_parents
|
||||
|
||||
def test_overloading_properties_does_not_change_column_order
|
||||
column_names = OverloadedType.column_names
|
||||
assert_equal %w(id overloaded_float unoverloaded_float overloaded_string_with_limit non_existent_decimal), column_names
|
||||
assert_equal %w(id overloaded_float unoverloaded_float overloaded_string_with_limit string_with_default non_existent_decimal), column_names
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -860,6 +860,7 @@ def except(adapter_names_to_exclude)
|
||||
t.float :overloaded_float, default: 500
|
||||
t.float :unoverloaded_float
|
||||
t.string :overloaded_string_with_limit, limit: 255
|
||||
t.string :string_with_default, default: 'the original default'
|
||||
end
|
||||
end
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user