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.


Reply via email to