aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/persistence.rb
Commit message (Collapse)AuthorAgeFilesLines
* `destroy` shouldn't raise when child associations fail to saveSean Griffin2015-07-241-1/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | Deep down in the association internals, we're calling `destroy!` rather than `destroy` when handling things like `dependent` or autosave association callbacks. Unfortunately, due to the structure of the code (e.g. it uses callbacks for everything), it's nearly impossible to pass whether to call `destroy` or `destroy!` down to where we actually need it. As such, we have to do some legwork to handle this. Since the callbacks are what actually raise the exception, we need to rescue it in `ActiveRecord::Callbacks`, rather than `ActiveRecord::Persistence` where it matters. (As an aside, if this code wasn't so callback heavy, it would handling this would likely be as simple as changing `destroy` to call `destroy!` instead of the other way around). Since we don't want to lose the exception when `destroy!` is called (in particular, we don't want the value of the `record` field to change to the parent class), we have to do some additional legwork to hold onto it where we can use it. Again, all of this is ugly and there is definitely a better way to do this. However, barring a much more significant re-architecting for what I consider to be a reletively minor improvement, I'm willing to take this small hit to the flow of this code (begrudgingly).
* refactor ActiveRecord's #become by simplifying codeDiego Carrion2015-06-101-2/+1
|
* Merge pull request #19886 from henders/henders/reload_wipe_query_cacheRafael Mendonça França2015-05-271-1/+3
|\ | | | | | | Cause ActiveRecord::Base::reload to also ignore the QueryCache.
| * Cause ActiveRecord::Base::reload to also ignore the QueryCache.Shane Hender2015-04-281-1/+3
| |
* | AR::RecordNotSaved & RecordNotDestroyed should include an error messageYuki Nishijima2015-05-011-2/+2
| | | | | | | | | | | | | | When `AR::Base.save!` or `AR::Base.destroy!` is called and an exception is raised, the exception doesn't have any error message or has a weird message like `#<FailedBulb:0x0000000907b4b8>`. Give a better message so we can easily understand why it's failing to save/destroy.
* | remove trailing whitespace. [ci skip]Yves Senn2015-04-271-1/+1
| |
* | Merge pull request #19918 from vngrs/becomes_missing_note_about_stiYves Senn2015-04-271-1/+3
|\ \ | |/ |/| | | Add note about sti column value to becomes method [ci skip]
| * Add note about sti column value to becomes method [ci skip]Mehmet Emin İNAÇ2015-04-271-2/+4
|/
* Use _read_attribute(primary_key) instead of idRafael Mendonça França2015-04-191-1/+1
| | | | | | | | | This will avoid the indirection of having calling id since we already know which is the primary key column. Also this will make explicit the behavior since it is not clear that id gets the right primary key value and not just the value of the "id" column.
* Raise StaleObjectError if touched object is stale and locking is enabledMehmet Emin İNAÇ2015-04-191-3/+15
| | | | | | | | | | Fixes #19776 change test variable names and use more verbose on method less verbose use _read_attribute instead of send
* Batch touch parent recordsArthur Neves2015-04-081-1/+2
| | | | | | | | | | [fixes #18606] Make belongs_to use touch over touch_later when running the callbacks. Add more tests and small method rename Thanks Jeremy for the feedback.
* call `sync_with_transaction_state` inside `persisted?` then check ivarsAaron Patterson2015-03-021-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | directly calling `sync_with_transaction_state` is not fast, so if we call it once, we can improve the performance of the `persisted?` method. This is important because every call to `url_for(model)` will call `persisted?`, so we want that to be fast. Here is the benchmark: ```ruby require 'active_record' ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:" ActiveRecord::Base.connection.instance_eval do create_table(:articles) end class Article < ActiveRecord::Base; end article = Article.new.tap(&:save!) Benchmark.ips do |x| x.report("persisted?") do article.persisted? end end ``` Before this patch: ``` $ bundle exec ruby -rbenchmark/ips persisted.rb Calculating ------------------------------------- persisted? 3.333k i/100ms ------------------------------------------------- persisted? 51.037k (± 8.2%) i/s - 253.308k ``` After: ``` $ bundle exec ruby -rbenchmark/ips persisted.rb Calculating ------------------------------------- persisted? 7.172k i/100ms ------------------------------------------------- persisted? 120.730k (± 5.1%) i/s - 602.448k ```
* Merge pull request #16989 from Empact/reload-cache-clearRafael Mendonça França2015-02-201-3/+0
|\ | | | | | | Isolate access to @associations_cache and @aggregations_cache to the Associations and Aggregations modules, respectively.
| * Isolate access to @associations_cache and @aggregations cache to the ↵Ben Woosley2014-09-281-3/+0
| | | | | | | | | | | | | | | | Associations and Aggregations modules, respectively. This includes replacing the `association_cache` accessor with a more limited `association_cached?` accessor and making `clear_association_cache` and `clear_aggregation_cache` private.
* | Merge pull request #17139 from mfazekas/fix_becomes_changed_attributesRafael Mendonça França2015-02-201-1/+2
|\ \ | | | | | | | | | Always reset changed attributes in becomes
| * | Always reset changed attributes in becomesMiklos Fazekas2015-02-041-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When ```becomes``` changes @attributes it should also change @changed_attributes. Otherwise we'll experience a kind of split head situation where attributes are coming from ```self```, but changed_attributes is coming from ```klass.new```. This affects the inheritance_colmn as it's changed by new for example. Fixes #16881
* | | Add `time` option to `#touch`Hyonjee Joo2015-02-181-6/+8
|/ / | | | | | | | | | | Fixes #18905. `#touch` now takes time as an option. Setting the option saves the record with the updated_at/on attributes set to the current time or the time specified. Updated tests and documentation accordingly.
* | add destroyed records to the currend transactionAaron Patterson2015-02-011-0/+1
| |
* | Use 'public_send' over the 'send' method for object's properties.Santosh Wadghule2015-01-231-2/+2
| |
* | Run SQL only if attribute changed for update_attribute methodPrathamesh Sonpatki2015-01-181-1/+1
| | | | | | | | | | - This is based on https://github.com/rails/rails/issues/18400 but tackling same issue with update_attribute method instead of update method.
* | Go through normal where logic in destroySean Griffin2015-01-141-9/+1
| | | | | | | | | | | | Building the Arel AST, and manipulating the relation manually like this is prone to errors and breakage as implementation details change from underneath it.
* | Deprecate `false` as the way to halt AR callbacksclaudiob2015-01-021-14/+14
| | | | | | | | | | | | | | | | | | | | Before this commit, returning `false` in an ActiveRecord `before_` callback such as `before_create` would halt the callback chain. After this commit, the behavior is deprecated: will still work until the next release of Rails but will also display a deprecation warning. The preferred way to halt a callback chain is to explicitly `throw(:abort)`.
* | Add doc for `:touch` option of AR::Base#saveclaudiob2014-12-301-0/+8
| | | | | | | | | | | | | | | | | | ActiveRecord::Base `save` and `save!` take an option boolean `:touch` parameter since #18225 (stems from #18202). This commit document that parameter. [ci skip]
* | Provide :touch option to save() to accommodate saving without updating ↵Dan Olson2014-12-271-6/+6
| | | | | | | | timestamps. [#18202]
* | Correct grammar to fix #18182 [ci skip]Zachary Scott2014-12-241-1/+1
| |
* | document that `.delete` does work on `#readonly?` records. Closes #11860Yves Senn2014-12-031-0/+2
| | | | | | | | | | | | | | | | [ci skip] This is due to the fact that `.delete` is directly translated to SQL. It tries to follow the same rules as `.delete_all` which is not able to verify that records are `#readonly?`.
* | Fix a bug where AR::RecordNotSaved loses error messagesYuki Nishijima2014-11-271-1/+1
| | | | | | | | | | | | Since 3e30c5d, it started ignoring the given error message. This commit changes the behavior of AR::RecordNotSaved#initialize so that it no longer loses the given error message.
* | Add #record attribute to RecordNotFound and RecordDestroyed exceptions.Recursive Madman2014-11-261-2/+2
| | | | | | | | This allows these exceptions to be handled generically in conjunction with RecordInvalid.
* | Remove the unused second argument to `substitute_at`Sean Griffin2014-11-171-1/+1
| | | | | | | | Oh hey, we got to remove some code because of that!
* | Revert "Improve performance of AR object instantiation"Sean Griffin2014-11-141-25/+3
| | | | | | | | | | | | | | | | | | | | This reverts commit 8fee923888192a658d8823b31e77ed0683dfd665. Conflicts: activerecord/lib/active_record/attribute_set/builder.rb This solution sucks, and is hard to actually apply across the board. Going to try other solutions
* | Print out a meaningful error when ActiveRecord::ReadOnlyRecord is raisedFranky W2014-11-061-2/+2
| | | | | | | | | | | | | | Currently, there is no messages which get printed out. Convoluted system may have hooks that create other objects in which case we only fail with no messages. This commit changes this information allowing you to know which object is the one that actually raised the error.
* | Improve performance of AR object instantiationSean Griffin2014-11-051-3/+25
|/ | | | | | | We introduced a performance hit by adding an additional iteration through a model's attributes on creation. We don't actually need the values from `Result` to be a hash, we can separate the columns and values and zip them up ourself during the iteration that we have to do.
* Implement `_was` and `changes` for in-place mutations of AR attributesSean Griffin2014-08-161-1/+1
|
* update error message to reflect that the record could have been destroyedlsylvester2014-08-111-1/+2
|
* Rephrase how we explain RecordInvalid exception in the context ofZachary Scott2014-08-071-3/+5
| | | | | | `#create!` regarding validations in contrast to the behavior of `#create`. Also describe creating multiple objects using an array of hashes as the +attributes+ parameter. [ci skip] /cc #16384
* [ci skip] Updated create! documentation description and added +attributes+ ↵Tom Kadwill2014-08-071-2/+5
| | | | for rdoc
* Moved #create! method from Validations to Persistence moduleBogdan Gusiev2014-08-051-0/+12
|
* After find-via-reload, the record is not newMatthew Draper2014-07-051-0/+1
|
* Remove unneeded `@column_types` instance variableSean Griffin2014-06-221-2/+0
| | | | This was used more previously, but other uses have been removed.
* `reload` should fully reload attributesSean Griffin2014-06-221-1/+1
| | | | | | `reload` is meant to put a record in the same state it would be if you were to do `Post.find(post.id)`. This means we should fully replace the attributes hash.
* Introduce an object to aid in creation and management of `@attributes`Sean Griffin2014-06-191-5/+1
| | | | | 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-8/+2
|
* Introduce an Attribute object to handle the type casting danceSean Griffin2014-06-131-4/+8
| | | | | | | | | | | | | | | 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
* No need to decorate columns twiceSean Griffin2014-06-101-1/+0
| | | | | | | We never want result types to override column types, and `decorate_columns` can only affect column types. No need to go through the decoration multiple times, we can just exclude the column types from the result types instead.
* Remove duplicated `@raw_attributes.keys`Sean Griffin2014-06-071-2/+2
| | | | | Reduces the number of things outside of attribute methods that cares about the details of how we store and type cast attributes
* Bring type casting behavior of hstore/json in line with serializedSean Griffin2014-06-041-1/+1
| | | | | `@raw_attributes` should not contain the type-cast, mutable version of the value.
* New records should remain new after yaml serializationSean Griffin2014-06-011-1/+5
|
* Rename attribute related instance variables to better express intentSean Griffin2014-05-301-5/+5
| | | | | | | | | `@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.
* docs, `instantiate` expects `String` keys. [Rafal Piekarski & Yves Senn]Yves Senn2014-05-201-4/+4
| | | | | Closes #15122 Closes #15107
* Merge pull request #11650 from prathamesh-sonpatki/renameRafael Mendonça França2014-04-041-4/+4
|\ | | | | | | Renamed private methods _create_record and _update_record