aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/core.rb
Commit message (Collapse)AuthorAgeFilesLines
...
* Backwards compat for activerecord-deprecated_findersstopdropandrew2014-09-161-0/+2
| | | | | | | Maintain compatibility for: * ActiveRecord::Base#find(:all) * ActiveRecord::Base#find(:first) * ActiveRecord::Base#find(:last)
* Allow included modules to override association methods.Yves Senn2014-09-091-2/+0
| | | | | | | | | | Closes #16684. This is achieved by always generating `GeneratedAssociationMethods` when `ActiveRecord::Base` is subclassed. When some of the included modules of `ActiveRecord::Base` were reordered this behavior was broken as `Core#initialize_generated_modules` was no longer called. Meaning that the module was generated on first access.
* Skip StatementCache for eager loaded associations (Fixes #16761)Sammy Larbi2014-09-041-0/+1
| | | | | | Eagerly loaded collection and singular associations are ignored by the StatementCache, which causes errors when the queries they generate reference columns that were not eagerly loaded. This commit skips the creation of the StatementCache as a fix for these scenarios.
* Override #find_by! in core to enable AST cachingGodfrey Chan2014-08-251-0/+4
|
* Fixed find_by("sql fragment without bindings") on masterGodfrey Chan2014-08-251-1/+1
| | | | | | | | | | | * Also duplicated find_by tests from relations_test.rb to finder_test.rb now that we have a completely different implementation on the class (in core.rb with AST caching stuff). * Also removed a (failing) test that used mocks. Now that we have tests for the behavior, there's no point having another test that tests the implementation (that it delegates). Further, what the test was implying is nolonger true with the current implementation, because Class.find_by is a real method now.
* Merge pull request #15718 from chancancode/regression_from_15694Godfrey Chan2014-07-161-0/+5
|\ | | | | Fixed a regression introduced in 84cf156
| * Fixed a regression introduced in 84cf156Godfrey Chan2014-06-141-0/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 84cf156 (PR #15694) introduced a subtle regression. There are actually three distinct entry points to creating an AR object – via .new (i.e. #initialize), via #init_with (e.g. from YAML or database queries) and via .allocate. With the patch in 84cf156, attribute methods and respond_to? will not work correctly when objects are allocated directly, without going through either The reason this test case didn't catch the regression was that the `Topic` class is shared between test cases, so by the time this test case is ran the attribute methods are very likely to be defined. Switching to use a fresh anonymous class in the test to ensure we surface this problem in the future.
* | Merge pull request #16015 from sgrif/sg-ensure-initializedRafael Mendonça França2014-07-021-4/+1
|\ \ | | | | | | | | | | | | | | | | | | Move pk initialization logic onto `AttributeSet` Conflicts: activerecord/lib/active_record/attribute_set.rb
| * | Move pk initialization logic onto `AttributeSet`Sean Griffin2014-07-021-4/+1
| | | | | | | | | | | | Better encapsulates its internals from `ActiveRecord::Base`.
* | | Don't error when `dup`ing a record with no PKSean Griffin2014-07-021-2/+1
|/ /
* | Simplify creation of default attributes on AR instanceSean Griffin2014-06-291-6/+1
| | | | | | | | `AttributeSet#dup` has all the behavior we need.
* | Move writing unknown column exception to null attributeSean Griffin2014-06-261-1/+1
| | | | | | | | | | | | Making this change revealed several subtle bugs related to models with no primary key, and anonymous classes. These have been fixed as well, with regression tests added.
* | Encapsulate the creation of `Attribute` objectsSean Griffin2014-06-261-2/+2
| | | | | | | | | | | | | | | | This will make it less painful to add additional properties, which should persist across writes, such as `name`. Conflicts: activerecord/lib/active_record/attribute_set.rb
* | Remove unneeded `@column_types` instance variableSean Griffin2014-06-221-2/+0
| | | | | | | | This was used more previously, but other uses have been removed.
* | Return a null object from `AttributeSet#[]`Sean Griffin2014-06-201-1/+3
| |
* | docs, configurations method is listed in the docs. [ci skip]Yves Senn2014-06-201-1/+0
| | | | | | | | | | The :singleton-method: directive is printed in the docs. This directive is not necessary as the method is documentable just fine.
* | Introduce an object to aid in creation and management of `@attributes`Sean Griffin2014-06-191-4/+3
|/ | | | | Mostly delegation to start, but we can start moving a lot of behavior in bulk to this object.
* Remove unused column types overrideSean Griffin2014-06-131-3/+0
|
* Merge pull request #15689 from sgrif/sg-attribute-methodsMatthew Draper2014-06-141-0/+1
|\ | | | | Ensure we always define attribute methods
| * Ensure we always define attribute methodsSean Griffin2014-06-131-0/+1
| |
* | Merge pull request #15593 from sgrif/sg-attributeRafael Mendonça França2014-06-131-19/+18
|\ \ | |/ |/| Introduce an Attribute object to handle the type casting dance
| * Introduce an Attribute object to handle the type casting danceSean Griffin2014-06-131-19/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | There's a lot more that can be moved to these, but this felt like a good place to introduce the object. Plans are: - Remove all knowledge of type casting from the columns, beyond a reference to the cast_type - Move type_cast_for_database to these objects - Potentially make them mutable, introduce a state machine, and have dirty checking handled here as well - Move `attribute`, `decorate_attribute`, and anything else that modifies types to mess with this object, not the columns hash - Introduce a collection object to manage these, reduce allocations, and not require serializing the types
* | Defer to super, rather than re-implementing Object#hashSean Griffin2014-06-121-1/+5
| |
* | Fix performance regression on preloading HABTM associationsSean Griffin2014-06-121-1/+1
|/ | | | | | | | | | | We'd spend a lot of time calling `hash` and `eql?` on the join model, which has no primary key. Calling `id` with no primary key is a really slow way to get back `nil`, so we can improve the performance there. However, even with the escape clause, we *still* weren't getting high enough performance, as we were checking the primary key too much. `hash` will always return `nil.hash` for records with no id, and `==` will always return `false`. We can optimize those cases in the HABTM join model.
* Keep the types of virtual columns after yaml serializationSean Griffin2014-06-101-0/+1
| | | | | On MySQL and PostgreSQL, the adapter does not type cast virtual columns for us.
* Move conditionals about freezing closer to the definition of `freeze`Sean Griffin2014-06-071-0/+6
| | | | | | | Reduces the number of places that care about the internals of how we store and type cast attributes. We do not need to go through the dup/freeze dance, as you couldn't have saved a frozen new record anyway, and that is the only time we would end up modifying the frozen hash.
* Bring type casting behavior of hstore/json in line with serializedSean Griffin2014-06-041-3/+6
| | | | | `@raw_attributes` should not contain the type-cast, mutable version of the value.
* Merge pull request #15172 from notEthan/active_record_pretty_printRafael Mendonça França2014-06-031-0/+23
|\ | | | | | | | | | | | | implement ActiveRecord::Base#pretty_print Conflicts: activerecord/CHANGELOG.md
| * implement ActiveRecord::Base#pretty_print + changelogEthan2014-05-291-0/+23
| |
* | Keep column defaults in type cast formSean Griffin2014-06-031-1/+1
| | | | | | | | | | | | | | | | | | | | The contract of `_field_changed?` assumes that the old value is always type cast. That is not the case for the value in `Column#default` as things are today. It appears there are other public methods that assume that `Column#default` is type cast, as well. The reason for this change originally was because the value gets put into `@raw_attributes` in initialize. This reverts to the old behavior on `Column`, and updates `initialize` to make sure that the values are in the right format.
* | Remove unused `initialize_attributes` methodSean Griffin2014-06-021-3/+2
| | | | | | | | | | This was previously a hook for a special case related to `serialize`, which has since been removed.
* | New records should remain new after yaml serializationSean Griffin2014-06-011-1/+2
| |
* | Remove most code related to serialized propertiesSean Griffin2014-06-011-1/+1
| | | | | | | | | | | | | | | | | | | | | | Nearly completely implemented in terms of custom properties. `_before_type_cast` now stores the raw serialized string consistently, which removes the need to keep track of "state". The following is now consistently true: - `model.serialized == model.reload.serialized` - A model can be dumped and loaded infinitely without changing - A model can be saved and reloaded infinitely without changing
* | Rename attribute related instance variables to better express intentSean Griffin2014-05-301-11/+11
|/ | | | | | | | | `@attributes` was actually used for `_before_type_cast` and friends, while `@attributes_cache` is the type cast version (and caching is the wrong word there, but I'm working on removing the conditionals around that). I opted for `@raw_attributes`, because `_before_type_cast` is also semantically misleading. The values in said hash are in the state given by the form builder or database, so raw seemed to be a good word.
* Fixed serialization for records with an attribute named `format`.Godfrey Chan2014-05-221-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * * * This bug can be triggered when serializing record R (the instance) of type C (the class), provided that the following conditions are met: 1. The name of one or more columns/attributes on C/R matches an existing private method on C (e.g. those defined by `Kernel`, such as `format`). 2. The attribute methods have not yet been generated on C. In this case, the matching private methods will be called by the serialization code (with no arguments) and their return values will be serialized instead. If the method requires one or more arguments, it will result in an `ArgumentError`. This regression is introduced in d1316bb. * * * Attribute methods (e.g. `#name` and `#format`, assuming the class has columns named `name` and `format` in its database table) are lazily defined. Instead of defining them when a the class is defined (e.g. in the `inherited` hook on `ActiveRecord::Base`), this operation is deferred until they are first accessed. The reason behind this is that is defining those methods requires knowing what columns are defined on the database table, which usually requires a round-trip to the database. Deferring their definition until the last-possible moment helps reducing unnessary work, especially in development mode where classes are redefined and throw away between requests. Typically, when an attribute is first accessed (e.g. `a_book.format`), it will fire the `method_missing` hook on the class, which triggers the definition of the attribute methods. This even works for methods like `format`, because calling a private method with an explicit receiver will also trigger that hook. Unfortunately, `read_attribute_for_serialization` is simply an alias to `send`, which does not respect method visibility. As a result, when serializing a record with those conflicting attributes, the `method_missing` is not fired, and as a result the attribute methods are not defined one would expected. Before d1316bb, this is negated by the fact that calling the `run_callbacks` method will also trigger a call to `respond_to?`, which is another trigger point for the class to define its attribute methods. Therefore, when Active Record tries to run the `after_find` callbacks, it will also define all the attribute methods thus masking the problem. * * * The proper fix for this problem is probably to restrict `read_attribute_for_serialization` to call public methods only (i.e. alias `read_attribute_for_serialization` to `public_send` instead of `send`). This however would be quite risky to change in a patch release and would probably require a full deprecation cycle. Another approach would be to override `read_attribute_for_serialization` inside Active Record to force the definition of attribute methods: def read_attribute_for_serialization(attribute) self.class.define_attribute_methods send(attribute) end Unfortunately, this is quite likely going to cause a performance degradation. This patch therefore restores the behaviour from the 4-0-stable branch by explicitly forcing the class to define its attribute methods in a similar spot (when records are initialized). This should not cause any extra roundtrips to the database because the `@columns` should already be cached on the class. Fixes #15188.
* Merge branch 'master' into adequaterecordAaron Patterson2014-04-201-0/+1
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * master: (74 commits) [ci skip] builtin -> built-in Fix code indentation and improve formatting Grammar fix in Getting Started Guide Make URL escaping more consistent Optimize URI escaping Always escape string passed to url helper. Remove statement assuming coffee shop/public space wifi is inherently insecure Don't rely on Arel master in bug report template [ci skip] wrap methods in backticks [ci skip] "subhash" --> "sub-hash" multibyte_conformance.rb --> multibyte_conformance_test.rb Fix inconsistent behavior from String#first/#last `@destroyed` should always be set to `false` when an object is duped. remove warning `warning: ambiguous first argument; put parentheses or even spaces` :uglify -> :uglifier Regression test for irregular inflection on has_many Singularize association names before camelization Fix spelling and proper nouns Optimize select_value, select_values, select_rows and dry up checking whether to exec with cache for Postgresql adapter Include default rails protect_from_forgery with: :exception ... Conflicts: activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb
| * `@destroyed` should always be set to `false` when an object is duped.Kuldeep Aggarwal2014-04-191-0/+1
| |
* | use an array for bind params to simplify substitutionAaron Patterson2014-04-121-4/+4
| |
* | decouple the factory method from the constructing modelAaron Patterson2014-04-101-2/+2
| | | | | | | | | | | | The factory method only requires the constructing model to get the connection object. Since the model is available when calling the factory method, we can just pass the appropriate connection in.
* | remove intelligence from StatementCache#initializeAaron Patterson2014-04-101-2/+2
| |
* | stop caching the class on the statement cache objectAaron Patterson2014-04-101-2/+2
| |
* | tests still pass when caching unprepared statementsAaron Patterson2014-04-091-1/+0
| |
* | Merge branch 'master' into adequaterecordAaron Patterson2014-04-071-1/+1
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * master: (122 commits) Rails.application should be set inside before_configuration hook remove check for present? from delete_all Remove useless begin..end Build the reverse_order on its proper method. Use connection-specific bytea escaping Ignore order when doing count. make enums distinct per class Remove unused `subclass_controller_with_flash_type_bar` var from flash test. fix CollectionProxy delete_all documentation Added OS X specific commands to installation guide [ci skip] Recommended using homebrew for installing MySQL and PostgreSQL Fix setup of adding _flash_types test. Use SVG version of travis build status badge [skip ci] W3C CSP document moved to gihub.io URL [ci skip] sprockets-rails was released Fix the test defining the models in the right place Add CHANGELOG entry for #11650 [ci skip] Declare the assets dependency Use sass-rails 4.0.3 Make possible to use sprockets-rails 2.1 add missing parentheses to validates_with documentation [skip ci] ...
| * Ensure we are returning either `true` or `false` for `#==`Godfrey Chan2014-03-291-1/+1
| | | | | | | | | | | | 460eb83d cused `ActiveRecord::Base#==` to sometimes return `nil` in some cases, this ensures we always return a boolean value. Also fixed a similar problem in AR reflections.
* | add the deprecation to adequate record tooAaron Patterson2014-03-131-1/+5
| |
* | we can't cache when the arguments are a hashAaron Patterson2014-02-271-1/+3
| |
* | cache queries in the Model.find(id) pathAaron Patterson2014-02-181-0/+26
| |
* | add AST cache to the find_by methodAaron Patterson2014-02-171-0/+35
|/
* Add config to disable schema dump after migrationEmil Soman2014-02-061-0/+9
| | | | | | | | | * Add a config on Active Record named `dump_schema_after_migration` * Schema dump doesn't happen if the config is set to false * Set default value of the config to true * Set config in generated production environment file to false * Update configuration guide * Update CHANGELOG
* Make arel methods private APIRafael Mendonça França2014-02-011-2/+2
| | | | | | Since its conception arel was made to be private API of Active Record. If users want to use arel features directly we should provide a way using the Active Record API without exposing the arel implementation.