openbuildings / jam-freezable
Freeze dynamically computed values in the database using Jam
Installs: 3 038
Dependents: 0
Suggesters: 1
Security: 0
Stars: 0
Watchers: 15
Forks: 0
Open Issues: 0
Type:kohana-module
Requires
- php: >=5.3.0
- composer/installers: *
- openbuildings/jam: 0.4.*
Requires (Dev)
This package is auto-updated.
Last update: 2024-10-21 21:52:12 UTC
README
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.