Skip to content

Instantly share code, notes, and snippets.

@robinjfisher
Last active August 29, 2015 14:19
Show Gist options
  • Save robinjfisher/97e48f126b940d9db767 to your computer and use it in GitHub Desktop.
Save robinjfisher/97e48f126b940d9db767 to your computer and use it in GitHub Desktop.
Statesman transition error
class AbsenceTransition < ActiveRecord::Base
include Statesman::Adapters::ActiveRecordTransition
belongs_to :absence, inverse_of: :absence_transitions
end
Loading development environment (Rails 4.2.0)
irb(main):001:0> a = Absence.last
Absence Load (0.4ms) SELECT `absences`.* FROM `absences` ORDER BY `absences`.`id` DESC LIMIT 1
=> #<Absence id: 11, from: "2015-04-30 08:30:00", to: "2015-04-30 17:30:00", employee_notes: "", user_id: 3, absence_category_id: 1, units_used: 8.0, created_at: "2015-04-12 14:04:59", updated_at: "2015-04-12 14:04:59", half_day_am: false, half_day_pm: false, full_day: true>
irb(main):002:0> a.current_state
AbsenceTransition Load (0.4ms) SELECT `absence_transitions`.* FROM `absence_transitions` WHERE `absence_transitions`.`absence_id` = 11 ORDER BY `absence_transitions`.`sort_key` DESC LIMIT 1
=> "unapproved"
irb(main):003:0> a.transition_to!(:provisionally_approved)
AbsenceTransition Load (0.5ms) SELECT `absence_transitions`.* FROM `absence_transitions` WHERE `absence_transitions`.`absence_id` = 11 ORDER BY `absence_transitions`.`sort_key` DESC LIMIT 1
AbsenceTransition Load (0.5ms) SELECT `absence_transitions`.* FROM `absence_transitions` WHERE `absence_transitions`.`absence_id` = 11 ORDER BY `absence_transitions`.`sort_key` DESC LIMIT 1
(0.2ms) BEGIN
SQL (0.4ms) UPDATE `absence_transitions` SET `absence_transitions`.`most_recent` = 0 WHERE `absence_transitions`.`absence_id` = 11
SQL (0.3ms) INSERT INTO `absence_transitions` (`to_state`, `sort_key`, `most_recent`, `metadata`, `absence_id`, `created_at`, `updated_at`) VALUES ('provisionally_approved', 0, 1, '{}', 11, '2015-04-12 14:05:40.523399', '2015-04-12 14:05:40.523399')
User Load (0.5ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1
Account Load (0.4ms) SELECT `accounts`.* FROM `accounts` WHERE `accounts`.`id` = 1 LIMIT 1
RailsSettings::ScopedSettings Load (0.4ms) SELECT `settings`.* FROM `settings` WHERE `settings`.`thing_type` = 'Account' AND `settings`.`thing_id` = 1 AND `settings`.`var` = 'secondary_approval' ORDER BY `settings`.`id` ASC LIMIT 1
SQL (0.4ms) UPDATE `absence_transitions` SET `absence_transitions`.`most_recent` = 0 WHERE `absence_transitions`.`absence_id` = 11
SQL (0.3ms) INSERT INTO `absence_transitions` (`to_state`, `sort_key`, `most_recent`, `metadata`, `absence_id`, `created_at`, `updated_at`) VALUES ('approved', 10, 1, '{\"user\":{\"account_id\":1,\"id\":3,\"first_name\":\"James\",\"surname\":\"Halpert\",\"date_of_birth\":null,\"ni_number\":\"43843864\",\"start_date\":\"2011-05-02\",\"archived\":false,\"created_at\":\"2015-03-17T16:13:09.000Z\",\"updated_at\":\"2015-04-12T12:43:57.000Z\",\"known_as\":\"Jim\",\"other_name\":\"Duncan\",\"gender\":\"Male\",\"email\":\"jim.halpert@example.com\",\"continuous_service_date\":null,\"marital_status\":null,\"nationality\":\"American\",\"manager\":false,\"admin\":false,\"super_user\":false,\"profile_pic_path\":\"/uploads/3/1426609009-jim-halpert.jpg\",\"parent_id\":1,\"holiday_entitlement\":224}}', 11, '2015-04-12 14:05:40.718039', '2015-04-12 14:05:40.718039')
(12.6ms) COMMIT
=> true
irb(main):004:0> a.transition_to!(:cancelled)
AbsenceTransition Load (0.6ms) SELECT `absence_transitions`.* FROM `absence_transitions` WHERE `absence_transitions`.`absence_id` = 11 ORDER BY `absence_transitions`.`sort_key` DESC LIMIT 1
(0.2ms) BEGIN
SQL (9.8ms) UPDATE `absence_transitions` SET `absence_transitions`.`most_recent` = 0 WHERE `absence_transitions`.`absence_id` = 11
Mysql2::Error: Duplicate entry '11-0' for key 'index_absence_transitions_parent_most_recent': UPDATE `absence_transitions` SET `absence_transitions`.`most_recent` = 0 WHERE `absence_transitions`.`absence_id` = 11
(6.1ms) ROLLBACK
Statesman::TransitionConflictError: Mysql2::Error: Duplicate entry '11-0' for key 'index_absence_transitions_parent_most_recent': UPDATE `absence_transitions` SET `absence_transitions`.`most_recent` = 0 WHERE `absence_transitions`.`absence_id` = 11
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/statesman-1.2.2/lib/statesman/adapters/active_record.rb:36:in `rescue in create'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/statesman-1.2.2/lib/statesman/adapters/active_record.rb:41:in `create'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/statesman-1.2.2/lib/statesman/machine.rb:226:in `transition_to!'
from /Users/robinjfisher/Code/pop/app/models/absence.rb:15:in `transition_to!'
from (irb):4
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/railties-4.2.0/lib/rails/commands/console.rb:110:in `start'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/railties-4.2.0/lib/rails/commands/console.rb:9:in `start'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/railties-4.2.0/lib/rails/commands/commands_tasks.rb:68:in `console'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/railties-4.2.0/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/railties-4.2.0/lib/rails/commands.rb:17:in `<top (required)>'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:274:in `require'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:274:in `block in require'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:240:in `load_dependency'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:274:in `require'
from /Users/robinjfisher/Code/pop/bin/rails:8:in `<top (required)>'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `load'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `block in load'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:240:in `load_dependency'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `load'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /Users/robinjfisher/.rbenv/versions/2.0.0-p598/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from -e:1:in `<main>'irb(main):005:0> exit
class CreateAbsenceTransitions < ActiveRecord::Migration
def change
create_table :absence_transitions do |t|
t.string :to_state, null: false
t.text :metadata
t.integer :sort_key, null: false
t.integer :absence_id, null: false
t.boolean :most_recent, null: false
t.timestamps null: false
end
add_index :absence_transitions, [:absence_id, :sort_key], unique: true, name: "index_absence_transitions_parent_sort"
add_index :absence_transitions, [:absence_id, :most_recent], unique: true, where: "most_recent", name: "index_absence_transitions_parent_most_recent"
end
end
class AbsenceStateMachine
include Statesman::Machine
state :unapproved, initial: true
state :provisionally_approved
state :approved
state :rejected
state :cancelled
transition from: :unapproved, to: [:provisionally_approved,:rejected,:cancelled]
transition from: :provisionally_approved, to: [:approved,:rejected,:cancelled]
transition from: :approved, to: :cancelled
after_transition(to: :provisionally_approved) do |absence,transition|
if absence.account.settings.secondary_approval == false || absence.account.settings.secondary_approval.nil?
absence.transition_to(:approved, user: absence.user)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment