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.
gem install has_price
In Rails you will automatically get has_price
in models.
Everywhere else you would need to include it yourself.
include HasPrice::HasPrice
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 on a Product
model.
class Product < ActiveRecord::Base
has_many :discounts
end
has_price
provides a small DSL with two methods, item
and 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
This builds an instance method price
on products which returns a Hash-like structure with some extra features. Now you can use it as so.
# Hypothetically, the actual numbers are stored in the aforementioned attributes on your model.
product = Product.find(1)
product.price # => Price hash-like object
product.price.total # => 500
product.price.base # => 400
product.price.taxes # => Price hash-like 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, serialization should work out of the box.
class Receipt < ActiveRecord::Base
serialize :price, Hash
end
Now passing the whole price breakdown into receipt is as simple as receipt.price = product.price
.