From 181f758a50698c4564b46a48d5704b48e9b3cf33 Mon Sep 17 00:00:00 2001 From: Shoichi Takagi Date: Thu, 25 Dec 2014 12:15:59 +0800 Subject: [PATCH] fix issue initial state doesn't work in active_record 4.2 --- lib/state_machine/integrations/active_record.rb | 8 ++++++++ lib/state_machine/machine.rb | 8 ++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/state_machine/integrations/active_record.rb b/lib/state_machine/integrations/active_record.rb index bb19f09c..795d3dd7 100644 --- a/lib/state_machine/integrations/active_record.rb +++ b/lib/state_machine/integrations/active_record.rb @@ -461,6 +461,14 @@ def column_defaults(*) #:nodoc: result end end_eval + + define_helper :class, <<-end_eval, __FILE__, __LINE__ + 1 + def _default_attributes #:nodoc: + result = super + self.state_machines.initialize_states(nil, :static => :force, :dynamic => false, :to => result) + result + end + end_eval end # Initializes dynamic states diff --git a/lib/state_machine/machine.rb b/lib/state_machine/machine.rb index 6aa6eae0..22a47943 100644 --- a/lib/state_machine/machine.rb +++ b/lib/state_machine/machine.rb @@ -700,9 +700,13 @@ def initialize_state(object, options = {}) state = initial_state(object) if state && (options[:force] || initialize_state?(object)) value = state.value - + if hash = options[:to] - hash[attribute.to_s] = value + if hash.is_a?(Hash) + hash[attribute.to_s] = value + else # for ActiveRecord 4.2. hash.is_a?(Activerecord::AttributeSet) + hash.write_cast_value(attribute.to_s, value) + end else write(object, :state, value) end