Last active
August 29, 2015 14:19
-
-
Save robinjfisher/97e48f126b940d9db767 to your computer and use it in GitHub Desktop.
Statesman transition error
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class AbsenceTransition < ActiveRecord::Base | |
include Statesman::Adapters::ActiveRecordTransition | |
belongs_to :absence, inverse_of: :absence_transitions | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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\":\"[email protected]\",\"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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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