1. 25 9月, 2015 7 次提交
    • S
      Improve the performance of `save` and friends · 136fc65c
      Sean Griffin 提交于
      The biggest source of the performance regression in these methods
      occurred because dirty tracking required eagerly materializing and type
      casting the assigned values. In the previous commits, I've changed dirty
      tracking to perform the comparisons lazily. However, all of this is moot
      when calling `save`, since `changes_applied` will be called, which just
      ends up eagerly materializing everything, anyway. With the new mutation
      tracker, it's easy to just compare the previous two hashes in the same
      lazy fashion.
      
      We will not have aliasing issues with this setup, which is proven by the
      fact that we're able to detect nested mutation.
      
      Before:
          User.create! 2.007k (± 7.1%) i/s -     10.098k
      
      After:
          User.create! 2.557k (± 3.5%) i/s -     12.789k
      
      Fixes #19859
      136fc65c
    • S
      Encapsulate a lot of the logic from `Dirty` in an object · 8a811c83
      Sean Griffin 提交于
      In order to improve the performance of dirty checking, we're going to
      need to duplicate all of the `previous_` methods in Active Model.
      However, these methods are basically the same as their non-previous
      counterparts, but comparing `@original_attributes` to
      `@previous_original_attributes` instead of `@attributes` and
      `@original_attributes`. This will help reduce that duplication.
      8a811c83
    • S
      Clean up the implementation of AR::Dirty · 8e633e50
      Sean Griffin 提交于
      This moves a bit more of the logic required for dirty checking into the
      attribute objects. I had hoped to remove the `with_value_from_database`
      stuff, but unfortunately just calling `dup` on the attribute objects
      isn't enough, since the values might contain deeply nested data
      structures. I think this can be cleaned up further.
      
      This makes most dirty checking become lazy, and reduces the number of
      object allocations and amount of CPU time when assigning a value. This
      opens the door (but doesn't quite finish) to improving the performance
      of writes to a place comparable to 4.1
      8e633e50
    • R
      Merge pull request #21754 from lucasmazza/lm-assert-difference · adfb823a
      Rafael Mendonça França 提交于
      Make `assert_difference` return the result of the yielded block.
      adfb823a
    • L
      Make `assert_difference` return the result of the yielded block. · 564b1620
      Lucas Mazza 提交于
      With this we can perform new assertions on the returned value without having
      to cache it with an outer variable or wrapping all subsequent assertions inside
      the `assert_difference` block.
      
      Before:
      
      ```
      post = nil
      assert_difference -> { Post.count }, 1 do
        Post.create
      end
      
      assert_predicate post, :persisted?
      ```
      
      Now:
      
      ```
      post = assert_difference -> { Post.count } do
        Post.create
      end
      
      assert_predicate post, :persisted?
      ```
      564b1620
    • R
      Merge pull request #21753 from jonatack/fix-typo-in-ignored_columns_test · 9b966f62
      Rafael Mendonça França 提交于
      Fix typo in ignored_columns test [skip ci]
      9b966f62
    • J
      Fix typo in ignored_columns test [skip ci] · c5d42513
      Jon Atack 提交于
      Follow-up to #21720.
      c5d42513
  2. 24 9月, 2015 33 次提交