Sequenzia/app/models/HistoryChange.php
2013-10-26 18:06:58 -05:00

126 lines
3.4 KiB
PHP
Executable File

<?php
class HistoryChange extends Rails\ActiveRecord\Base
{
protected $obj;
public function options()
{
$master_class = $this->master_class();
return $master_class::versioning()->get_versioned_attribute_options($this->column_name) ?: [];
}
public function master_class()
{
if ($this->table_name == 'pools_posts')
$class_name = 'PoolPost';
else
$class_name = Rails::services()->get('inflector')->classify($this->table_name);
return $class_name;
}
# Return true if this changes the value to the default value.
public function changes_to_default()
{
if (!$this->has_default())
return false;
// $master_class = $this->master_class();
// $column = $master_class::columns
return $this->value == $this->get_default();
}
public function is_obsolete()
{
$latest_change = $this->latest();
return $this->value != $latest_change->value;
}
public function has_default()
{
return isset($this->options()['default']);
}
public function get_default()
{
if ($this->has_default()) {
return $this->options()['default'];
}
}
# Return the default value for the field recorded by this change.
public function default_history()
{
if (!$this->has_default())
return null;
return new History([
'table_name' => $this->table_name,
'remote_id' => $this->remote_id,
'column_name' => $this->column_name,
'value' => $this->get_default()
]);
}
# Return the object this change modifies.
public function obj()
{
if (!$this->obj) {
$master_class = $this->master_class();
$this->obj = $master_class::find($this->remote_id);
}
return $this->obj;
}
public function latest()
{
return self::order('id DESC')
->where(
"table_name = ? AND remote_id = ? AND column_name = ?",
$this->table_name, $this->remote_id, $this->column_name
)->first();
}
public function next()
{
return self::order('id ASC')
->where(
"table_name = ? AND remote_id = ? AND id > ? AND column_name = ?",
$this->table_name, $this->remote_id, $this->id, $this->column_name
)->first();
}
protected function set_previous()
{
$obj = self::order('id DESC')
->where(
"table_name = ? AND remote_id = ? AND id < ? AND column_name = ?",
$this->table_name, $this->remote_id, $this->id, $this->column_name
)->first();
if ($obj) {
$this->setAssociation('previous', $obj);
$this->previous_id = $obj->id;
$this->save();
}
}
protected function associations()
{
return [
'belongs_to' => [
'history',
'previous' => ['class_name' => 'HistoryChange', 'foreign_key' => 'previous_id']
]
];
}
protected function callbacks()
{
return [
'after_create' => [
'set_previous'
]
];
}
}