Attribute Depends Calculator
The scenario of the gem is when you have an attribute on model that value depends of a calculation of other model's attribute which attribute's model related. AttributeDependsCalculator will help you solve the case
Installation
Add this line to your application's Gemfile:
gem 'attribute-depends-calculator'
And then execute:
$ bundle
Usage
Assume you have model order and order-item
class Order < ActiveRecord::Base
has_many :order_items
depend total_price: {order_items: :price}
end
class OrderItem < ActiveRecord::Base
belongs_to :order
end
And you can
order = Order.first
order.total_price
#=> 100.0
order.order_items.pluck(:price)
#=> [50.0, 50.0]
order_item = order.order_items.first
order_item.update(price: 100)
order.reload.total_price
#=> 150.0
As above show the price of order automatically update when whatever order_items changes
Advance
The options operator had two cateogries of value, the default value of the gem is expression sum
Operation
class Order < ActiveRecord::Base
has_many :order_items
depend total_price: {order_items: :price, operator: :+} # or :*
end
Expression
The following expression can be use to calculate the collection of depends attributes
sum
class Order < ActiveRecord::Base
...
depend total_price: {order_items: :price, operator: :sum} # default
end
average
class Order < ActiveRecord::Base
...
depend avg_price: {order_items: :price, operator: :average}
end
count
class Order < ActiveRecord::Base
...
depend order_items_count: {order_items: :price, operator: :count}
end
minimum
class Order < ActiveRecord::Base
...
depend min_price: {order_items: :price, operator: :minimum}
end
maximum
class Order < ActiveRecord::Base
...
depend max_price: {order_items: :price, operator: :maximum}
end
Contributing
- Fork it ( http://github.com/zmbacker/enum_help/fork )
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request
License
MIT © Falm