Automatically calculate a collection of depends attribute of ActiveRecord
Ruby Shell
Latest commit 7f02d20 Sep 2, 2016 @falm Add requirements
Permalink
Failed to load latest commit information.
bin irb Aug 2, 2016
lib require forwardable Aug 26, 2016
spec proc feature spec Aug 15, 2016
.coveralls.yml coverrails.yml Jul 24, 2016
.gitignore ignore temp file Aug 4, 2016
.rspec .rspec Jul 17, 2016
.travis.yml include rails5 only ruby3 Aug 26, 2016
Gemfile Using global Gemfile Aug 25, 2016
Gemfile.global global Gemfile Aug 24, 2016
Gemfile.rails40 rails4.0 Aug 26, 2016
Gemfile.rails41 rails 4.1 Aug 26, 2016
Gemfile.rails50 rails 5.0 Aug 26, 2016
README.md Add requirements Sep 2, 2016
Rakefile init commit Jul 13, 2016
attribute-depends-calculator.gemspec rack dependency Aug 26, 2016

README.md

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