Let's just say, it organizes your price breakdowns and allows for easy retrieval of price subgroups and subtotals, as well as simple serialization for your receipts.
Make sure gemcutter.org is in your sources.
sudo gem install has_price
In rails environment:
For any generic Ruby class:
require 'has_price' include HasPrice::HasPrice
P.S. Usage as Rails plugin is supported too, but gem is preferred.
Say you have a Product class with some attributes which price depends on. For this example assume that base_price, federal_tax, and state_tax are integer attributes existing on Product model.
class Product < ActiveRecord::Base has_many :discounts end
has_price provides a small DSL with two methods,
group, to help you organize this.
class Product < ActiveRecord::Base has_many :discounts has_price do item base_price, "base" group "taxes" do item federal_tax, "federal" item state_tax, "state" end group "discounts" do discounts.each do |discount| item discount.amount, discount.title end end end end
What we've done just now is — built instance method
price on products. Now you can use it as so.
# Hypothetically all these numbers are coming from the above declared instance methods. product = Product.find(1) product.price # => Price object product.price.total # => 500 product.price.base # => 400 product.price.taxes # => Price object product.price.taxes.federal # => 50 product.price.taxes.total # => 100 product.discounts.total # => -50
Price object actually inherits from a plain old Hash. Therefore, this will work:
class Receipt < ActiveRecord::Base serialize :price, Hash end
Now passing the whole price breakdown into receipt is as simple as
receipt.price = product.price.