No commit activity in last 3 years
No release in over 3 years
auto calculate collect of depends attribute value and save when that changes
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Development

~> 1.11
~> 10.0
 Project Readme

Attribute Depends Calculator

Build Status Coverage Status Code Climate Dependency Status Gem Version

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

Requirements

  1. Ruby 2.0+
  2. Rails 4.0+

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

Advanced

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

Proc

Proc can be passing in operator option, and the only one params is the active reload of the depended relate Model

class Order < ActiveRecord::Base
  ...
  depend discount_price: {order_items: :price, operator: -> (items) { items.sum(:price) * discount } }
end

Contributing

Bug reports and pull requests are welcome on GitHub

License

MIT © Falm