Description

Gem Version

ActiveRecord Model Status Manager, It provides easy ways managing models that have many statuses.

www.myrealtrip.com uses status-manager

Usage

Rails 3.x

ruby gem 'status-manager'

Example

Define

```ruby class Product < ActiveRecord::Base attr_accessible :title, :sale_status

attr_as_status :sale_status, 
	[:onsale, :reject, :pending, :soldout], 
	:default => :pending,
	:group => {
		:close => [:reject, :pending],
		:open => [:onsale, :soldout]
	}
# 1. :default and :group are optional
# 2. :group element :close and :open work as status
# 3. If you want to specify status value that save in database, use Hash instead of Array. 
# 	ex) {:onsale => "ONSALE", :pending => "PENDING" ...} or {:onsale => 1, :pending => 2 ...} end ``` or ```ruby class Product < ActiveRecord::Base
attr_accessible :title, :sale_status
# attr_as_status :status_attribute in model, => ‘status_value that is saved in database’
attr_as_status :sale_status, {
	:onsale => 'onsale', 
	:reject => 'reject', 
	:pending => 'pending', 
	:soldout => 'soldout'
	}
status_group :sale_status, {
	:close => [:reject, :pending],  # :close works as status
	:open => [:onsale, :soldout]
	}	 end ```

Queries

```ruby ## status_list Product.sale_statuses #=> => ‘onsale’, :reject => ‘reject’, :pending => ‘pending’, :soldout => ‘soldout’

use scope

@onsale_product = Product.sale_status_onsale.first @closed_product = Product.sale_status_close.first #or using symbol Product.sale_status(:open) #or multiple statuses (with group statuses) Product.sale_status([:soldout, :close]) # use array

@onsale_product.sale_status_onsale? #=> true #or @closed_product.sale_status?(:close) #=> true

change status

@closed_product.sale_status_to(:onsale) #or @closed_product.sale_status_to_onsale

update status

@closed_product.update_sale_status_to(:onsale) #or @closed_product.update_sale_status_to_onsale ```

Inspect status changing

```ruby pending_product = Product.sale_status(:pending).first pending_product.sale_status_to(:onsale)

pending_product.sale_status_changed? #=> true pending_product.sale_status_changed?(:from => :pending, :to => :onsale) #=> true pending_product.sale_status_changed?(:to => :onsale) #=>true pending_product.sale_status_changed?(:from => :onsale) #=> true ```

Callback

``` ruby class Product < ActiveRecord::Base attr_accessible :title, :sale_status

# attr_as_status :status_attribute in model, => ‘status_value that is saved in database’
attr_as_status :sale_status, 
	[:onsale, :reject, :pending, :soldout], 
	:default => :pending
	:group => {
		close: [:reject, :pending], 
		open: [:onsale, :soldout]
	}
	

#callback update status from specific status
before_status_update :sale_status, :onsale => :close do |product|
	product.sale_status_changed?(:from => :onsale, :to => :close) #=> true
	# do somthing
end

after_status_update :sale_status, :close => :onsale do |product|
	# do something after update 
end

#callback update status
after_status_update :sale_status, :reject do |prdocut|
	product.sale_status_changed? #=> true
	product.sale_status?(:reject) #=> true
	# do something after update
end end

```