1. 07 10月, 2015 1 次提交
  2. 06 10月, 2015 3 次提交
  3. 05 10月, 2015 1 次提交
    • A
      [ci skip] Fix ActiveRecord::Relation#update documentation · dc96af15
      akihiro17 提交于
      * before
      
      ```
      people = Person.where(group: 'expert')
      people.update(group: 'masters')
      
      Note: Updating a large number of records will run a
      UPDATE query for each record, which may cause a performance
      issue. So if it is not needed to run callbacks for each update, it is
      preferred to use <tt>update_all</tt> for updating all records using
      a single query.
      ```
      
      * after
      
      ```
      people = Person.where(group: 'expert')
      people.update(group: 'masters')
      ```
      Note: Updating a large number of records will run an
      UPDATE query for each record, which may cause a performance
      issue. So if it is not needed to run callbacks for each update, it is
      preferred to use <tt>update_all</tt> for updating all records using
      a single query.
      dc96af15
  4. 04 10月, 2015 1 次提交
  5. 03 10月, 2015 1 次提交
  6. 02 10月, 2015 5 次提交
    • S
      Build the `AttributeMutationTracker` lazily · ede244e2
      Sean Griffin 提交于
      For reads, we never need to construct this object. The double `defined?`
      check is to avoid errors in tests
      ede244e2
    • S
      Fix test failures on MySQL · 1a693c79
      Sean Griffin 提交于
      There were a few places where I missed a `create` vs `new`
      before_type_cast check, and the semantics of `reload` became wrong.
      1a693c79
    • S
      Further encapsulate dirty checking on `Attribute` · 07723c23
      Sean Griffin 提交于
      We can skip the allocation of a full `AttributeSet` by changing the
      semantics of how we structure things. Instead of comparing two separate
      `AttributeSet` objects, and `Attribute` is now a singly linked list of
      every change that has happened to it. Since the attribute objects are
      immutable, to apply the changes we simply need to copy the head of the
      list.
      
      It's worth noting that this causes one subtle change in the behavior of
      AR. When a record is saved successfully, the `before_type_cast` version
      of everything will be what was sent to the database. I honestly think
      these semantics make more sense, as we could have just as easily had the
      DB do `RETURNING *` and updated the record with those if we had things
      like timestamps implemented at the DB layer.
      
      This brings our performance closer to 4.2, but we're still not quite
      there.
      07723c23
    • G
      7d0b1e48
    • Y
      [ci skip] Fix comment · e889a226
      yui-knk 提交于
      `alias :migrations_path= :migrations_paths=`, so
      `migrations_path = some_string` is correct.
      e889a226
  7. 29 9月, 2015 5 次提交
  8. 28 9月, 2015 1 次提交
  9. 27 9月, 2015 3 次提交
  10. 26 9月, 2015 7 次提交
  11. 25 9月, 2015 5 次提交
    • S
      Apply subsecond precision on assignment when using TZ aware attributes · 20b177b7
      Sean Griffin 提交于
      When a time object was assigned to a datetime column, the decorator for
      TZ aware attributes wouldn't call super, so when using a database
      without support for subsecond precision, the nanosecond would not be
      truncated, leading to the value being marked as changed.
      
      Interestingly, this also shows our new implementation of dirty checking
      to be more robust than the old one (with less code and better
      performance! 🎉!!!)
      20b177b7
    • S
      We still need to reset `@changed_attributes` in `changes_applied` · 45735502
      Sean Griffin 提交于
      When I removed the call to `super` to avoid the setting of
      `@previous_changes`, I forgot to duplicate the other part of that
      behavior, which led to failing tests
      45735502
    • 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
  12. 24 9月, 2015 4 次提交
  13. 23 9月, 2015 3 次提交