From 144c0216160644f164a6dd762b25fe9a6c28a118 Mon Sep 17 00:00:00 2001 From: Parziphal Date: Wed, 9 Oct 2013 00:30:48 -0500 Subject: [PATCH] nighty commit? --- lib/Rails/ActionController/Base.php | 2 +- lib/Rails/ActionView/ViewHelpers.php | 1 + lib/Rails/ActiveRecord/Base.php | 68 ++--------------- .../Base/Methods/AssociationMethods.php | 76 +++++++++++++++++++ .../Base/Methods/AttributeMethods.php | 2 +- .../Base/Methods/RelationMethods.php | 4 +- .../ActiveRecord/Relation/Association.php | 3 +- .../ActiveSupport/Inflector/Inflector.php | 2 +- 8 files changed, 92 insertions(+), 66 deletions(-) diff --git a/lib/Rails/ActionController/Base.php b/lib/Rails/ActionController/Base.php index 0520678..a9c51ef 100755 --- a/lib/Rails/ActionController/Base.php +++ b/lib/Rails/ActionController/Base.php @@ -214,7 +214,7 @@ abstract class Base extends ActionController public function action_name() { - return Rails::services()->get('inflector')->camelize(Rails::application()->dispatcher()->router()->route()->action, true); + return Rails::services()->get('inflector')->camelize(Rails::application()->dispatcher()->router()->route()->action, false); } public function run_request_action() diff --git a/lib/Rails/ActionView/ViewHelpers.php b/lib/Rails/ActionView/ViewHelpers.php index 37cbe71..86d61dc 100755 --- a/lib/Rails/ActionView/ViewHelpers.php +++ b/lib/Rails/ActionView/ViewHelpers.php @@ -40,6 +40,7 @@ class ViewHelpers return $helper; } } + return false; } diff --git a/lib/Rails/ActiveRecord/Base.php b/lib/Rails/ActiveRecord/Base.php index f87e5e6..4279b15 100755 --- a/lib/Rails/ActiveRecord/Base.php +++ b/lib/Rails/ActiveRecord/Base.php @@ -11,7 +11,7 @@ use Rails\ActiveModel; abstract class Base { use Methods\CounterMethods, Methods\RelationMethods, Methods\ScopingMethods, - Methods\AttributeMethods, Methods\ModelSchemaMethods; + Methods\AttributeMethods, Methods\ModelSchemaMethods, Methods\AssociationMethods; /** * ActiveRecord_Registry instance. @@ -40,12 +40,6 @@ abstract class Base */ private $isNewRecord = true; - /** - * An array where loaded associations will - * be stored. - */ - private $loadedAssociations = []; - static public function __callStatic($method, $params) { if ($rel = static::scope($method, $params)) @@ -136,6 +130,11 @@ abstract class Base return self::connection()->selectValue('SELECT MAX(' . $attr . ') FROM ' . static::tableName()); } + static public function count() + { + return self::connection()->selectValue('SELECT COUNT(*) FROM `' . self::tableName() . '`'); + } + static public function I18n() { return Rails::application()->I18n(); @@ -523,23 +522,13 @@ abstract class Base $builder->build($attrs, $params); } } - - public function getAssociation($name) - { - if (isset($this->loadedAssociations[$name])) { - return $this->loadedAssociations[$name]; - } elseif ($assoc = $this->get_association_data($name)) { - $model = $this->_load_association($name, $assoc[0], $assoc[1]); - $this->loadedAssociations[$name] = $model; - return $this->loadedAssociations[$name]; - } - } /** * *************************** * Default protected methods { * *************************** * attrAccessible and attrProtected can be found in Base\Methods\AttributeMethods. + * associations can be found in Base\Methods\AssociationMethods */ /** @@ -550,11 +539,6 @@ abstract class Base { } - protected function associations() - { - return []; - } - /** * Example: * @@ -648,14 +632,6 @@ abstract class Base return true; } - /** - * @param array|Closure $params - Additional parameters to customize the query for the association - */ - private function _load_association($prop, $type, $params) - { - return $this->{'_find_' . $type}($prop, $params); - } - private function _get_parents_callbacks($callback_name) { $all_callbacks = array(); @@ -673,17 +649,6 @@ abstract class Base return $all_callbacks; } - # Returns association property names. - private function _associations_names() - { - $associations = array(); - foreach ($this->associations() as $assocs) { - foreach ($assocs as $k => $v) - $associations[] = is_int($k) ? $v : $k; - } - return $associations; - } - /** * @return bool * @see validations() @@ -937,25 +902,6 @@ abstract class Base return true; } - private function get_association_data($prop) - { - if ($assocs = $this->associations()) { - foreach ($assocs as $type => $assoc) { - foreach ($assoc as $name => $params) { - if (is_int($name)) { - $name = $params; - $params = array(); - } - - if ($name == $prop) { - return array($type, $params); - } - } - } - } - return false; - } - private function _register() { self::_registry()->register($this); diff --git a/lib/Rails/ActiveRecord/Base/Methods/AssociationMethods.php b/lib/Rails/ActiveRecord/Base/Methods/AssociationMethods.php index b3d9bbc..99c2844 100755 --- a/lib/Rails/ActiveRecord/Base/Methods/AssociationMethods.php +++ b/lib/Rails/ActiveRecord/Base/Methods/AssociationMethods.php @@ -1 +1,77 @@ loadedAssociations[$name])) { + return $this->loadedAssociations[$name]; + } elseif ($assoc = $this->get_association_data($name)) { + $model = $this->_load_association($name, $assoc[0], $assoc[1]); + $this->loadedAssociations[$name] = $model; + return $this->loadedAssociations[$name]; + } + } + + protected function setAssociation($name, $object) + { + if (!in_array($name, $this->_associations_names())) { + throw new Exception\RuntimeException( + sprintf("Tried to set unknown association: %s", $name) + ); + } + $this->loadedAssociations[$name] = $object; + } + + # Returns association property names. + private function _associations_names() + { + $associations = array(); + foreach ($this->associations() as $assocs) { + foreach ($assocs as $k => $v) + $associations[] = is_int($k) ? $v : $k; + } + return $associations; + } + + /** + * @param array|Closure $params - Additional parameters to customize the query for the association + */ + private function _load_association($prop, $type, $params) + { + return $this->{'_find_' . $type}($prop, $params); + } + + private function get_association_data($prop) + { + if ($assocs = $this->associations()) { + foreach ($assocs as $type => $assoc) { + foreach ($assoc as $name => $params) { + if (is_int($name)) { + $name = $params; + $params = array(); + } + + if ($name == $prop) { + return array($type, $params); + } + } + } + } + return false; + } +} diff --git a/lib/Rails/ActiveRecord/Base/Methods/AttributeMethods.php b/lib/Rails/ActiveRecord/Base/Methods/AttributeMethods.php index 0db3eaa..8f81a05 100755 --- a/lib/Rails/ActiveRecord/Base/Methods/AttributeMethods.php +++ b/lib/Rails/ActiveRecord/Base/Methods/AttributeMethods.php @@ -61,7 +61,7 @@ trait AttributeMethods // if (!Rails::config()->ar2) { // return static::table()->columnExists(static::properAttrName($name)); // } else { - return static::table()->columnExists($name); + return static::table()->columnExists($name); // } } diff --git a/lib/Rails/ActiveRecord/Base/Methods/RelationMethods.php b/lib/Rails/ActiveRecord/Base/Methods/RelationMethods.php index 7861696..c6f3499 100755 --- a/lib/Rails/ActiveRecord/Base/Methods/RelationMethods.php +++ b/lib/Rails/ActiveRecord/Base/Methods/RelationMethods.php @@ -170,7 +170,9 @@ trait RelationMethods */ private function _find_has_many($prop, $params) { - empty($params['class_name']) && $params['class_name'] = rtrim(ucfirst($prop), 's'); + $inflector = \Rails::services()->get('inflector'); + + empty($params['class_name']) && $params['class_name'] = $inflector->camelize($inflector->singularize($prop)); $builder = new Association($params, $this); $builder->build_query(); diff --git a/lib/Rails/ActiveRecord/Relation/Association.php b/lib/Rails/ActiveRecord/Relation/Association.php index 535ab33..449b939 100755 --- a/lib/Rails/ActiveRecord/Relation/Association.php +++ b/lib/Rails/ActiveRecord/Relation/Association.php @@ -27,8 +27,9 @@ class Association extends AbstractRelation $params = $this->params; if (empty($params['foreign_key'])) { + $inflector = \Rails::services()->get('inflector'); $cn = get_class($this->parent_model); - $params['foreign_key'] = substr($cn::tableName(), 0, -1).'_id'; + $params['foreign_key'] = $inflector->singularize($cn::tableName()).'_id'; } $query = new Relation($params['class_name'], $params['class_name']::tableName()); diff --git a/lib/Rails/ActiveSupport/Inflector/Inflector.php b/lib/Rails/ActiveSupport/Inflector/Inflector.php index 18737be..da627cf 100755 --- a/lib/Rails/ActiveSupport/Inflector/Inflector.php +++ b/lib/Rails/ActiveSupport/Inflector/Inflector.php @@ -147,7 +147,7 @@ class Inflector public function classify($tableName) { - return $this->camelize($this->singuralize(preg_replace('/.*\./', '', $tableName))); + return $this->camelize($this->singularize(preg_replace('/.*\./', '', $tableName))); } public function ordinal($number)