aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
Commit message (Collapse)AuthorAgeFilesLines
...
* | we don't need a HWIA and a hash allocated for just one k/v pairAaron Patterson2014-10-151-5/+3
| |
* | just look up the primary key from the columns hashAaron Patterson2014-10-151-6/+1
| |
* | add table.bigint supportAaron Patterson2014-10-153-1/+21
|/ | | | | | | | In the DSL you can now do: create_table(:foos) do |t| t.bigint :hi end
* Use if/else instead of early raiseRafael Mendonça França2014-10-151-2/+5
|
* Merge pull request #17267 from rebyn/masterRafael Mendonça França2014-10-154-0/+16
|\ | | | | | | Raise an error for has_one associations which try to go :through a polymorphic association
| * Raise an error for has_one associations which try to go :through a ↵Tu Hoang2014-10-154-0/+16
| | | | | | | | polymorphic association [#17263]
* | delete leftover JoinOperation structswapdisc2014-10-141-2/+0
|/
* Make the config actually copyableGodfrey Chan2014-10-141-1/+1
| | | The intention here is to make the required config copy-able from the console/logs, so add a newline at the end of the message to make that easier. (Otherwise it would be `... raise_in_transactional_callbacks = true (called from...`.)
* :scissors: duplicated `require`sGodfrey Chan2014-10-141-1/+0
|
* make sure cache is not used for collection assocations tooAaron Patterson2014-10-143-2/+19
| | | | follow up for #17052
* break cache if we're inside a "scoping" call. fixes #17052Aaron Patterson2014-10-142-1/+16
| | | | | For now, we don't want to take "scoping" calls in to account when calculating cache keys for relations, so just opt-out.
* Clarify `#update_all` doc about value processingNicolas Cavigneaux2014-10-141-1/+2
| | | | | | | | | This clarify the fact that `#update_all` doesn't type-cast passed values and that these values are written as-is in the SQL DB. Fix #17242 [ci skip]
* Merge pull request #17251 from claudiob/remove-duplicate-exceptionRafael Mendonça França2014-10-131-6/+10
|\ | | | | Remove duplicate error message "Couldn't find..."
| * Remove duplicate error message "Couldn't find..."claudiob2014-10-131-6/+10
| | | | | | | | | | | | | | | | | | This commit removes the duplication of the error message: > Couldn't find #{@klass.name} with [#{arel.where_sql}] introduced in #15791 by adding a private method `find_nth!` that deals with all the method like `first!` and `second!`.
* | measure record instantiation time in AS::NotificationsAaron Patterson2014-10-133-4/+58
| | | | | | | | | | emit an event when we instantiate AR objects so we can see how many records were instantiated and how long it took
* | add length to ActiveRecord::ResultAaron Patterson2014-10-132-0/+8
| |
* | Merge pull request #17232 from Agis-/issue-17209Rafael Mendonça França2014-10-134-1/+28
|\ \ | | | | | | Autosave callbacks shouldn't be `after_save` callbacks
| * | Autosave callbacks shouldn't be `after_save`Agis-2014-10-134-1/+28
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 068f092ced8483e557725542dd919ab7c516e567 registered autosave callbacks as `after_save` callbacks. This caused the regression described in #17209. Autosave callbacks should be registered as `after_update` and `after_create` callbacks, just like before. This is a partial revert of 068f092ced8483e557725542dd919ab7c516e567. Fixes #17209.
* | | Replace Enumerable#reverse.each with Enumerable#reverse_eachErik Michaels-Ober2014-10-131-1/+1
|/ /
* | Merge pull request #17014 from grosser/grosser/fast-fixturesAaron Patterson2014-10-103-66/+2
|\ \ | |/ |/| speed up fixtures by not loading all their classes
| * speed up fixtures by not loading all their classesgrosser2014-10-063-66/+2
| |
* | Merge pull request #17146 from divineforest/active-record-gsub-to-trRafael Mendonça França2014-10-072-2/+2
|\ \ | | | | | | Change `gsub` to `tr` where possible
| * | Change `gsub` to `tr` where possibleAlexander Balashov2014-10-062-2/+2
| | |
* | | unify PG spelling in CHANGELOGs. [ci skip]Yves Senn2014-10-061-1/+1
| | |
* | | [ci skip] Clarify deletion strategies for collection proxieseileencodes2014-10-041-17/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For detailed testing of behavior see: https://gist.github.com/eileencodes/5b0a2fe011dcff6203fe This shows destroy_all always destroys records and fires callbacks. It will never use nullify or delete_all delete_all's behavior varies greatly based on `hm` vs `hm:t` and deletion strategy.
* | | Merge pull request #16409 from ↵Zachary Scott2014-10-032-6/+10
|\ \ \ | |/ / |/| | | | | | | | justinweiss/update_validation_context_documentation Docs: Add a note on custom validation contexts. [ci skip]
| * | Add a note on custom validation contexts.Justin Weiss2014-08-052-6/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | The documentation on `:on` for validations was inconsistent, and most only referenced the `:create` and `:update` contexts. I fixed those to be consistent with the documentation on `AM::Validations.validates`, which seemed to have the best docs. [ci skip]
* | | Merge pull request #17088 from robin850/jruby-devRafael Mendonça França2014-10-011-0/+1
|\ \ \ | | | | | | | | Follow up to #16613
| * | | Follow up to #16613Robin Dupret2014-09-281-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since we want this flag to be enabled anytime we are running the tests under JRuby, let's enable this at the Rakefile level so people get the performance boost on their local checkout. Moreover, we avoid having to update this particular line anytime the option changes on the JRuby side. The only drawback is that we have to define it in every Rakefile but there's no big deal, this is already the case for other options.
* | | | use tr instead of gsub when possibleAdrian Rangel2014-10-011-1/+1
| | | |
* | | | Merge pull request #17093 from ↵Aaron Patterson2014-09-295-14/+14
|\ \ \ \ | | | | | | | | | | | | | | | | | | | | phiggins/remove-dynamic-send-on-built-in-callbacks Reduce allocations when running AR callbacks.
| * | | | Reduce allocations when running AR callbacks.Pete Higgins2014-09-285-14/+14
| |/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* | | | Use Hash#each_key instead of Hash#keys.eachErik Michaels-Ober2014-09-292-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | Hash#keys.each allocates an array of keys; Hash#each_key iterates through the keys without allocating a new array. This is the reason why Hash#each_key exists.
* | | | Remove defunct ivarsBen Woosley2014-09-282-11/+7
|/ / / | | | | | | | | | @column_names_with_alias, @dynamic_methods_hash, @time_zone_column_names, and @cached_time_zone
* | | Fix typo in AR changelogPrathamesh Sonpatki2014-09-271-1/+1
| | | | | | | | | | | | - middlware -> middleware
* | | some object allocation reduction for new AR objectsAaron Patterson2014-09-272-3/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Benchmark: ```ruby require 'objspace' require 'active_record' 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 ObjectSpace::AllocationTracer.trace do N.times { Article.find a.id } end ObjectSpace::AllocationTracer.allocated_count_table table.sort_by { |_,x| x }.each do |k,v| p k => (v / N) end ```
* | | Preparing for 4.2.0.beta2 releaseRafael Mendonça França2014-09-261-1/+1
| | |
* | | ar/connection_pool: honor overriden rack.test in middlewareSimon Eskildsen2014-09-233-1/+14
| | | | | | | | | | | | | | | | | | | | | Honoring an overidden `rack.test` allows testing closed connection between multiple requests. This is useful if you're working on database resiliency, to ensure the connection is in the expected state from one request to another on the same worker.
* | | Update changelog with tenderlove's entryPrathamesh Sonpatki2014-09-231-1/+5
| | | | | | | | | | | | [ci skip]
* | | add a truncate method to the connectionAaron Patterson2014-09-226-0/+38
| |/ |/| | | | | | | | | it doesn't work on SQLite3 since it doesn't support truncate, but that's OK. If you call truncate on the connection, you're now bound to that database (same as if you use hstore or any other db specific feature).
* | Clarify the documentation of the primary_key option for associationsPeter Marsh2014-09-221-1/+1
| | | | | | | | | | | | | | Previously the documentation stated that `primary_key` should be the name of a *method* that returns the primary key used for the association. This is incorrect. This changes the documentation to say that the value must be the name of a column.
* | Better regression test for Fixtures with fk as a symbolArthur Neves2014-09-222-11/+2
| |
* | fix fixtures not loading if a belongs_to association is defined with a ↵Will Bryant2014-09-222-1/+10
| | | | | | | | :foreign_key option that's a symbol
* | Fix assertions in AR::TestCase::AttributeMethodsTestYuki Nishijima2014-09-211-3/+3
| | | | | | | | | | This test has always been green because it uses "assert" and the first argument is an truthy class/object.
* | Fix typo [ci skip]Yuki Nishijima2014-09-201-1/+1
| |
* | Merge pull request #16987 from jonatack/patch-8Yves Senn2014-09-201-13/+15
|\ \ | | | | | | | | | ActiveRecord CHANGELOG improvements [skip ci]
| * | ActiveRecord CHANGELOG improvements [skip ci]Jon Atack2014-09-201-13/+15
|/ /
* | No need to call to_sym hereGodfrey Chan2014-09-203-10/+10
| | | | | | | | | | The hash is now string-keyed, and [_]reflect_on_association calls `to_s` on the argument anyway.
* | Fix find_by with associations not working with adequate recordGodfrey Chan2014-09-202-0/+8
| | | | | | | | | | | | | | | | | | For now, we will just skip the cache when a non-column key is used in the hash. If the future, we can probably move some of the logic in PredicateBuilder.expand up the chain to make caching possible for association queries. Closes #16903 Fixes #16884
* | Quick fix to address the borken build caused by #15791Godfrey Chan2014-09-201-1/+1
| | | | | | | | | | | | This is pretty lame though, so feel free to send a PR with a better fix! ;) cc @zev @tenderlove