openbuildings/jam-freezable

Freeze dynamically computed values in the database using Jam

Installs: 3 017

Dependents: 0

Suggesters: 1

Security: 0

Stars: 0

Watchers: 15

Forks: 0

Open Issues: 0

Type:kohana-module

0.1.3 2014-03-01 10:15 UTC

This package is auto-updated.

Last update: 2024-03-21 20:39:48 UTC


README

Build Status Scrutinizer Quality Score Code Coverage Latest Stable Version

Freezable is a Jam ORM behavior for freezing dynamically computed values in the database.

Often one would have a method in the model which computes and returns a value. It could be a price, time or anything else. The computation could be a heavy one or time sensitive (based on time, currency exchange rates and other). Then you would need to save the value in a database column (a.k.a freezing) and in the future read the value from the field rather than the method.

The Freezable behavior allows you to do exactly that in an easy way. The freeze(), unfreeze() and is_frozen() methos give you the convenience to easily get either the dynamically computed or the frozen value when needed.

Usage

It has 3 parameters associations, parent and fields

class Some_Model extends Jam_Model {

	public static function initialize(Jam_Meta $meta)
	{
		$meta
			->behaviors(array(
				'freezable' => Jam::behavior('freezable', array(
					'fields' => 'price',
					'parent' => 'some_parent_model',
					'associations' => array('some_child', 'some_children'),
				)),
			));
	}
	//...
}

That means that whenever the model is frozen then the field named price will be assigned the value of the method price(). And all the associations will be also frozen. The associations themselves have to be freezable (have the Freezable behavior attached) in order for this to work. And the price() method, as well as any other fields, have to take into account the value of the field. E.g.

public function price()
{
	return $this->price ? $this->price : $this->compute_price();
}

The parent association is used in order to find the value of is_frozen, so that only one model holds the value of the flag. So that if you call is_frozen() on a freezable that has a parent, then it will get that value from the parent.

Details

TODO: add note about validation TODO: add more examples

License

Copyright (c) 2013 OpenBuildings, Inc. Developed by Ivan Kerin as part of clippings.com.

Under BSD-3-Clause license, read LICENSE file.