I am using Hobo 1.3.3 & Rails 3.0.19
I have a model device.rb for which I needed to track
*
a tech_status, and
*
an admin_status
using lifecycles.
As per Bryan’s ‘You can't have more than one Lifecycle in a model, …. you
can always create a child model to hold the second Lifecycle.’
I have tried to tackle this issue using the STI approach, and defined
*
the tech_status lifecycle in device.rb, and
*
the admin_status lifecycle in device_son.rb, as in the following code :
I am using Hobo 1.3.3 & Rails 3.0.19
I have a model device.rb for which I needed to track
*
a tech_status, and
*
an admin_status
using lifecycles.
As per Bryan’s ‘You can't have more than one Lifecycle in a model, …. you
can always create a child model to hold the second Lifecycle.’
I have tried to tackle this issue using the STI approach, and defined
*
the tech_status lifecycle in device.rb, and
*
the admin_status lifecycle in device_son.rb, as in the following code :
/class Device < ActiveRecord::Base/
/hobo_model # Don't put anything above this/
/../
/# :tech_status lifecycle/
/lifecycle :state_field => :tech_status do/
/state :for_workshop, :default => true/
/state :all_ok,/
/:scrapped,/
/:deactivated/
/transition :complete, /
/{ :for_workshop => :all_ok },/
/:available_to => :technicians do/
/# Create new tech_status_change object ; this tracks tech_status history/
/@rtsc = self.tech_status_changes.new( :new_tech_status => :all_ok,
:operator => acting_user )/
/# Save object;/
/@rtsc.save/
/end/
/transition :deactivate, /
/{ :for_workshop => :deactivated },/
/:available_to => :technicians do/
/@rtsc = self.tech_status_changes.new( :new_tech_status => :deactivated,
:operator => acting_user )/
/@rtsc.save/
/end/
/transition :scrap, { :for_workshop => :scrapped },/
/:available_to => :technicians do/
/@rtsc = self.tech_status_changes.new( :new_tech_status => :scrapped,
:operator => acting_user )/
/@rtsc.save/
/end/
/# The following :receive transitions get called programatically;/
/# For documented reasons, we lose access to acting_user in contained
models/
/# acting_user is only set on the model during a create or a /
/# save; it's available in the various validation methods, permission /
/# methods and callbacks, but not typically set outside that context/
/transition :receive, { :scrapped => :for_workshop },/
/:available_to => :all do/
/@rtsc = self.tech_status_changes.new( :new_tech_status =>
:for_workshop, :operator => acting_user )/
/@rtsc.save/
/end/
/transition :receive,/
/{ :deactivated => :for_workshop },/
/:available_to => :all do/
/@rtsc = self.tech_status_changes.new( :new_tech_status =>
:for_workshop, :operator => acting_user )/
/@rtsc.save/
/end/
/transition :receive, { :all_ok => :for_workshop },/
/:available_to => :all do/
/@rtsc = self.tech_status_changes.new( :new_tech_status =>
:for_workshop, :operator => acting_user )/
/@rtsc.save/
/end/
/end/
…
and,
/class DeviceSon < Device /
/# This is a STI Model definition/
/# --- Lifecycles --- #/
/# :admin_status lifecycle/
/lifecycle :state_field => :admin_status do/
/state :undefined, :default => true/
/state :in_stock, # Device is in stock/
/:internal_asset, # Device capitalised for internal use/
/:sold, # Device sold to regular customer/
/:demo, # Device 'demo'ed from stock; device is issued in this state/
/:available, # Device available for loan or rent; device not issued in
this state/
/:rented, # Device rented; device is issued in this state/
/:loaned # Device loaned; device is issued in this state/
/# New device => stock; callable by :accountants/
/transition :to_stock, /
/{ :undefined => :in_stock },/
/:available_to => :all do/
/@dasc = self.admin_status_changes.new( :new_admin_status => :in_stock,
:operator => acting_user )/
/@dasc.save/
/end/
/# Stock => capitalisation for internal use; callable by :accountants/
/transition :capitalise_internal, /
/{ :in_stock => :internal_asset },/
/:available_to => :all do/
/@dasc = self.admin_status_changes.new( :new_admin_status =>
:internal_asset, :operator => acting_user )/
/@dasc.save/
/end/
/# Stock => capitalisation for rental/loan use; callable by :accountants/
/transition :capitalise_for_rental, /
/{ :in_stock => :available },/
/:available_to => :all do/
/@dasc = self.admin_status_changes.new( :new_admin_status => :available,
:operator => acting_user )/
/@dasc.save/
/end/
/# Trade-in sold device for internal use; callable by :accountants/
/transition :trade_in_internal, /
/{ :sold => :internal_asset },/
/:available_to => :all do/
/@dasc = self.admin_status_changes.new( :new_admin_status =>
:internal_asset, :operator => acting_user )/
/@dasc.save/
/end/
/# Trade-in sold device for rental/loan use; callable by :accountants/
/transition :trade_in_for_rental, /
/{ :sold => :available },/
/:available_to => :all do/
/@dasc = self.admin_status_changes.new( :new_admin_status => :available,
:operator => acting_user )/
/@dasc.save/
/end/
/# Sell device from stock; callable by :accountants/
/transition :sell, /
/{ :in_stock => :sold },/
/:available_to => :all do/
/@dasc = self.admin_status_changes.new( :new_admin_status => :sold,
:operator => acting_user )/
/@dasc.save/
/end/
/# Issue device from stock for demonstration purposes; callable by
:coordinators/
/transition :issue_demo, /
/{ :in_stock => :demo },/
/:available_to => :all do/
/@dasc = self.admin_status_changes.new( :new_admin_status => :demo,
:operator => acting_user )/
/@dasc.save/
/end/
/# Issue device for rental; callable by :coordinators/
/transition :issue_rent, /
/{ :available => :rented },/
/:available_to => :all do/
/@dasc = self.admin_status_changes.new( :new_admin_status => :rented,
:operator => acting_user )/
/@dasc.save/
/end/
/# Issue device for loan; callable by :coordinators/
/transition :issue_loan, /
/{ :available => :loaned },/
/:available_to => :all do/
/@dasc = self.admin_status_changes.new( :new_admin_status => :loaned,
:operator => acting_user )/
/@dasc.save/
/end/
/# Receive device from loan; callable by :coordinators/
/transition :return, /
/{ :loaned => :available },/
/:available_to => :all do/
/@dasc = self.admin_status_changes.new( :new_admin_status => :available,
:operator => acting_user )/
/@dasc.save/
/end/
/# Receive device from rent; callable by :coordinators/
/transition :return, /
/{ :rented => :available },/
/:available_to => :all do/
/@dasc = self.admin_status_changes.new( :new_admin_status => :available,
:operator => acting_user )/
/@dasc.save/
/end/
/# Return demo device back to stock; callable by :coordinators/
/transition :return, /
/{ :demo => :in_stock },/
/:available_to => :all do/
/@dasc = self.admin_status_changes.new( :new_admin_status => :in_stock,
:operator => acting_user )/
/@dasc.save/
/end/
/end/
…
The above migrates properly, the lifecycle state field is created in the
parent model but I cannot call a transition in the admin_status lifecycle !!
In fact, in the console(using an instance variable my_dev_son, of class
DevSon) :
my_dev_son.lifecycle.class # => Device::Lifecycle,
I was expecting DeviceSon::Lifecycle.
I got this to work using a rather inelegant :has_one => :device_son &
belongs_to approach, but this uses two tables of course; it just does
not feel right !!!
--
You received this message because you are subscribed to the Google
Groups "Hobo Users" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/hobousers?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.