aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel/lib/active_model
Commit message (Collapse)AuthorAgeFilesLines
* Disallow appended newlines when parsing as integerMichael Genereux2014-10-021-1/+1
| | | \Z allows appended newlines where \z does not.
* Refactor callback setup in to use lambda instead of evalPablo Herrero2014-09-302-3/+5
|
* Reduce allocations when running AR callbacks.Pete Higgins2014-09-282-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Inspired by @tenderlove's work in c363fff29f060e6a2effe1e4bb2c4dd4cd805d6e, this reduces the number of strings allocated when running callbacks for ActiveRecord instances. I measured that using this script: ``` require 'objspace' require 'active_record' require 'allocation_tracer' ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:" ActiveRecord::Base.connection.instance_eval do create_table(:articles) { |t| t.string :name } end class Article < ActiveRecord::Base; end a = Article.create name: "foo" a = Article.find a.id N = 10 result = ObjectSpace::AllocationTracer.trace do N.times { Article.find a.id } end result.sort.each do |k,v| p k => v end puts "total: #{result.values.map(&:first).inject(:+)}" ``` When I run this against master and this branch I get this output: ``` pete@balloon:~/projects/rails/activerecord$ git checkout master M Gemfile Switched to branch 'master' pete@balloon:~/projects/rails/activerecord$ bundle exec ruby benchmark_allocation_with_callback_send.rb > allocations_before pete@balloon:~/projects/rails/activerecord$ git checkout remove-dynamic-send-on-built-in-callbacks M Gemfile Switched to branch 'remove-dynamic-send-on-built-in-callbacks' pete@balloon:~/projects/rails/activerecord$ bundle exec ruby benchmark_allocation_with_callback_send.rb > allocations_after pete@balloon:~/projects/rails/activerecord$ diff allocations_before allocations_after 39d38 < {["/home/pete/projects/rails/activesupport/lib/active_support/callbacks.rb", 81]=>[40, 0, 0, 0, 0, 0]} 42c41 < total: 630 --- > total: 590 ``` In addition to this, there are two micro-optimizations present: * Using `block.call if block` vs `yield if block_given?` when the block was being captured already. ``` pete@balloon:~/projects$ cat benchmark_block_call_vs_yield.rb require 'benchmark/ips' def block_capture_with_yield &block yield if block_given? end def block_capture_with_call &block block.call if block end def no_block_capture yield if block_given? end Benchmark.ips do |b| b.report("block_capture_with_yield") { block_capture_with_yield } b.report("block_capture_with_call") { block_capture_with_call } b.report("no_block_capture") { no_block_capture } end pete@balloon:~/projects$ ruby benchmark_block_call_vs_yield.rb Calculating ------------------------------------- block_capture_with_yield 124979 i/100ms block_capture_with_call 138340 i/100ms no_block_capture 136827 i/100ms ------------------------------------------------- block_capture_with_yield 5703108.9 (±2.4%) i/s - 28495212 in 4.999368s block_capture_with_call 6840730.5 (±3.6%) i/s - 34169980 in 5.002649s no_block_capture 5821141.4 (±2.8%) i/s - 29144151 in 5.010580s ``` * Defining and calling methods instead of using send. ``` pete@balloon:~/projects$ cat benchmark_method_call_vs_send.rb require 'benchmark/ips' class Foo def tacos nil end end my_foo = Foo.new Benchmark.ips do |b| b.report('send') { my_foo.send('tacos') } b.report('call') { my_foo.tacos } end pete@balloon:~/projects$ ruby benchmark_method_call_vs_send.rb Calculating ------------------------------------- send 97736 i/100ms call 151142 i/100ms ------------------------------------------------- send 2683730.3 (±2.8%) i/s - 13487568 in 5.029763s call 8005963.9 (±2.7%) i/s - 40052630 in 5.006604s ``` The result of this is making typical ActiveRecord operations slightly faster: https://gist.github.com/phiggins/e46e51dcc7edb45b5f98
* Preparing for 4.2.0.beta2 releaseRafael Mendonça França2014-09-261-1/+1
|
* Move the array to a constantGodfrey Chan2014-09-231-3/+4
|
* Update error message for validate methodPrathamesh Sonpatki2014-09-201-1/+6
| | | | | - Improve the error message by suggesting that the user may have intended to call validates instead of validate method.
* use `allow_blank` option insteadKuldeep Aggarwal2014-09-141-1/+1
|
* Refer to the library name instead of the constantRobin Dupret2014-08-301-1/+1
| | | | | | | | | When we are loading a component and we want to know its version, we are actually not speaking about the constant but the library itself. [ci skip] [Godfrey Chan & Xavier Noria]
* Merge branch 'master' of github.com:rails/railsDavid Heinemeier Hansson2014-08-293-11/+9
|\
| * Merge pull request #16661 from edogawaconan/doc-fixYves Senn2014-08-271-1/+1
| |\ | | | | | | Update documentation to match change in #5942 [ci skip]
| | * Update documentation to match change in #5942 [ci skip]edogawaconan2014-08-241-1/+1
| | |
| * | Use ActiveSupport::Concern instead of the traditinal wayYukio Mizuta2014-08-251-7/+7
| |/
| * Using `each_with_object` instead of `reduce`Attila Domokos2014-08-221-2/+2
| | | | | | | | | | This way no new object allocation is taking place. Thanks @jeremy for the suggestion!
| * Replacing an each with reduceAttila Domokos2014-08-211-4/+2
| | | | | | | | | | | | | | | | The functionality has not changed, but the code is more elegant by using `reduce` instead of `each`. This way no accumulator needs to be declared, no explicit return is needed.
* | Preparing for 4.2.0.beta1 releaseDavid Heinemeier Hansson2014-08-191-1/+1
|/
* Check attributes passed to create_with and whereRafael Mendonça França2014-08-181-0/+1
| | | | | | | | | | | If the request parameters are passed to create_with and where they can be used to do mass assignment when used in combination with Relation#create. Fixes CVE-2014-3514 Conflicts: activerecord/lib/active_record/relation/query_methods.rb
* No need to check model_name anymoreRafael Mendonça França2014-08-171-4/+2
|
* Merge pull request #15889 from carnesmedia/model-nameRafael Mendonça França2014-08-176-8/+12
|\ | | | | | | Use #model_name on instances instead of classes
| * Use #model_name on instances instead of classesAmiel Martin2014-06-246-8/+12
| | | | | | | | | | | | This allows rails code to be more confdent when asking for a model name, instead of having to ask for the class. Rails core discussion here: https://groups.google.com/forum/#!topic/rubyonrails-core/ThSaXw9y1F8
* | Don't expose these new APIs yet (added in 877ea78 / #16189)Godfrey Chan2014-08-161-14/+15
| | | | | | | | | | | | | | WARNING: don't use them! They might change or go away between future beta/RC/ patch releases! Also added a CHANGELOG entry for this.
* | Implement `_was` and `changes` for in-place mutations of AR attributesSean Griffin2014-08-161-3/+16
| |
* | Allow password to contain spaces only.Yevhene Shemet2014-08-061-2/+2
| |
* | Call public methods rather than class_eval'ingCarlos Antonio da Silva2014-08-051-4/+2
| |
* | Fix example code of `EachValidator` [ci skip]Chun-wei Kuo2014-07-281-1/+1
| | | | | | | | | | We have to specify the `:title` option to really use the `TitleValidator` defined above.
* | %i doesn't work on 1.9Aaron Patterson2014-07-171-1/+1
| |
* | check for valid options in validate methodsonnym2014-07-171-0/+6
| | | | | | | | | | | | | | | | | | | | | | This change prevents a certain class of user error which results when mistakenly using the `validate` class method instead of the `validates` class method. Only apply when all arguments are symbols, because some validations use the `validate` method and pass in additional options, namely the `LenghValidator` via the `ActiveMode::Validations::validates_with` method.
* | Make restore_attributes publicRafael Mendonça França2014-07-171-5/+5
| | | | | | | | | | | | | | Also make it accept a list of attributes to be changed. This will make possible to restore only a subset of the changed attributes. Closes #16203
* | Deprecate `reset_#{attribute}` in favor of `restore_#{attribute}`.Rafael Mendonça França2014-07-151-4/+12
| | | | | | | | | | | | | | | | | | These methods may cause confusion with the `reset_changes` that behaves differently of them. Also rename undo_changes to restore_changes to match this new set of methods.
* | Deprecate ActiveModel::Dirty#reset_changes in favor of ↵Rafael Mendonça França2014-07-151-4/+12
| | | | | | | | | | | | | | | | | | #clear_changes_information This method name is causing confusion with the `reset_#{attribute}` methods. While `reset_name` set the value of the name attribute for the previous value the `reset_changes` only discard the changes and previous changes.
* | [ci skip] Little bit doc code improvement.Santosh Wadghule2014-07-141-1/+1
| |
* | Only automatically include validations when enabledGodfrey Chan2014-07-021-1/+2
| | | | | | | | This is a follow up to #16024.
* | automatically include ActiveModel::Validations when include ↵Aditya Kapoor2014-07-031-0/+1
| | | | | | | | ActiveModel::SecurePassword
* | Silence warning emitted in testsSean Griffin2014-07-011-0/+1
| | | | | | | | | | The instance method `model_name` was being defined multiple times, causing a redefinition warning.
* | Rename rollback_changes to undo_changesRafael Mendonça França2014-06-301-3/+3
| | | | | | | | To avoid overload with database rollback
* | Add CHANGELOG entry for #14861 and document private methods on the APIRafael Mendonça França2014-06-301-5/+5
| |
* | Merge pull request #14861 from igor04/dirty-rollbackRafael Mendonça França2014-06-301-0/+17
|\ \ | | | | | | | | | Added rollback method to ActiveModel::Dirty
| * | Added rollback method to ActiveModel::Dirtyigor042014-06-231-0/+17
| | |
* | | We are talking about the libraries, not the constantsSean Griffin2014-06-271-3/+3
| | |
* | | Note that `_will_change!` is no longer needed for AR instancesSean Griffin2014-06-271-3/+5
| | | | | | | | | | | | | | | | | | | | | Leave the note for `ActiveModel`, since it can't yet detect mutations (hopefully we can change this in time for 4.2). However, we now detect mutations on all supported types in `ActiveRecord`, so we can note that `_will_change!` is no longer needed there.
* | | Merge pull request #15834 from rmehner/allow_proc_and_symbol_for_only_integerRafael Mendonça França2014-06-261-1/+13
|\ \ \ | |_|/ |/| | Allow proc and symbol as values for `only_integer` of `NumericalityValidator`
| * | `only_integer` of `NumericalityValidator` now allows procs and symbolsRobin Mehner2014-06-221-1/+13
| | |
* | | Delegate #model_name method to self.classYuki Nishijima2014-06-221-0/+6
|/ /
* | :scissors: and :nail_care: from d60c405 [ci skip]Zachary Scott2014-06-161-3/+3
| |
* | [ci skip] correct doc for serialization in accordance with API Doc GuideAditya Kapoor2014-06-161-11/+11
| |
* | Edit pass on `has_secure_password` documentation [ci skip]Godfrey Chan2014-06-141-5/+6
| |
* | [ci skip] Update #has_secure_password docsAkshay Vishnoi2014-06-141-6/+9
| |
* | SecurePassword - Validate password must be less than or equal to 72Akshay Vishnoi2014-06-141-0/+6
| | | | | | | | See #14591, Reason - BCrypt hash function can handle maximum 72 characters.
* | Merge pull request #15690 from deeeki/activemodel_model_docArthur Nogueira Neves2014-06-131-3/+3
|\ \ | | | | | | [ci skip] Clarify ActiveModel::Model docs
| * | [ci skip] Clarify ActiveModel::Model docsdeeeki2014-06-141-3/+3
| | | | | | | | | | | | ActiveModel attributes initialized with String return String values
* | | [ci skip] correct docs for conversionAditya Kapoor2014-06-111-5/+12
|/ /