1. 27 12月, 2014 20 次提交
    • S
      We don't need additional type casting for locking updates · 796574c9
      Sean Griffin 提交于
      Part of the larger refactoring to remove type casting from Arel. We can
      inform it that we already have the right type by wrapping the value in
      an `Arel::Nodes::Quoted`. This commit can be reverted when we have
      removed type casting from Arel in Rail 5.1
      796574c9
    • S
      Go through normal where logic in `apply_join_dependency` · 3eb16cea
      Sean Griffin 提交于
      Part of the larger refactoring to remove type casting from Arel.
      3eb16cea
    • S
      We don't need to type cast the offset in `find_in_batches` · b4e6e474
      Sean Griffin 提交于
      Part of the larger refactoring to remove type casting from Arel. We can
      inform it that we already have the right type by wrapping the value in
      an `Arel::Nodes::Quoted`. This commit can be reverted when we have
      removed type casting from Arel in Rail 5.1
      b4e6e474
    • S
      Fall back to type casting from the connection adapter · a11a8ff7
      Sean Griffin 提交于
      There are several valid cases where right now we can't determine the
      association's class in a call to `where`. In these cases, we can fall
      back to casting by looking up the column from the connection adapter
      (which is what happens right now when we fall through to Arel)
      
      This is ugly, and since we're trying to separate the concept of a type
      from a column, I'd like to remove it in the future. The problem
      basically comes down to this:
      
          Liquid.joins(molecules: :electrons)
            .where("molecules.name" => "something", "electrons.name" => "something")
      
      The hash in this case will turn into:
      
          {
            molecules: { name: "something" },
            electrons: { name: "something" },
          }
      
      What we actually need is:
      
          {
            molecules: {
              name: "something",
              electrons: { name: "something" },
            }
          }
      
      /cc @mrgilman
      a11a8ff7
    • S
      Go through normal `where` logic in uniqueness validation · 5f521cbf
      Sean Griffin 提交于
      This code could use some much heavier refactoring. It looks like
      `build_relation` duplicates most of the logic of `Relation#where` and
      `PredicateBuilder` with regards to handling associations and attribute
      aliases
      5f521cbf
    • S
      We don't need to cast the value a second time in uniqueness validations · efe59866
      Sean Griffin 提交于
      Part of the larger refactoring to remove type casting from Arel. Since
      we've already cast the value a few lines above, we don't need to re-cast
      it later. We can inform Arel of this by wrapping it in an
      `Arel::Nodes::Quoted`, which will no longer be required in Rails 5.1
      efe59866
    • S
      We don't need to perform type casting on the STI condition · 09369726
      Sean Griffin 提交于
      We will always have the correct type for this query, so no casting is
      needed. We inform Arel that we already have the right type by wrapping
      it in an `Arel::Nodes::Quoted` (which we will no longer need to do in
      Rails 5.1)
      09369726
    • S
      Go through normal `where` logic when preloading associations · b98668de
      Sean Griffin 提交于
      This will allow eager type casting to take place as needed. There
      doesn't seem to be any particular reason that the `in` statement was
      forced for single values, and the commit message where it was introduced
      gives no context.
      
      See
      https://github.com/rails/rails/commit/d90b4e2615e8048fdeffc6dffe3246704adee01f
      b98668de
    • S
      Eagerly cast array values passed to the predicate builder · 6d4a19cd
      Sean Griffin 提交于
      Part of a larger refactoring to remove type casting from Arel.
      
      /cc @mrgilman
      
      [Sean Griffin & Melanie Gilman]
      6d4a19cd
    • S
      Eagerly cast range values in the predicate builder · eac4658b
      Sean Griffin 提交于
      A custom object is required for this, as you cannot build a range
      object out of `Arel::Nodes::Quoted` objects. Depends on the changes
      introduced in
      https://github.com/rails/arel/commit/cf03bd45e39def057a2f63e42a3391b7d750dece
      
      /cc @mrgilman
      eac4658b
    • S
      Perform casting of single values within the predicate builder · 3179b4a8
      Sean Griffin 提交于
      As part of the larger refactoring to remove type casting from Arel, we
      need to do the casting of values eagerly. The predicate builder is the
      closest place that knows about the Active Record class, and can
      therefore have the type information.
      
      /cc @mrgilman
      
      [Sean Griffin & Melanie Gilman]
      3179b4a8
    • S
      Remove `klass` and `arel_table` as a dependency of `PredicateBuilder` · a60770d3
      Sean Griffin 提交于
      This class cares far too much about the internals of other parts of
      Active Record. This is an attempt to break out a meaningful object which
      represents the needs of the predicate builder. I'm not fully satisfied
      with the name, but the general concept is an object which represents a
      table, the associations to/from that table, and the types associated
      with it. Many of these exist at the `ActiveRecord::Base` class level,
      not as properties of the table itself, hence the need for another
      object. Currently it provides these by holding a reference to the class,
      but that will likely change in the future. This allows the predicate
      builder to remain wholy concerned with building predicates.
      
      /cc @mrgilman
      a60770d3
    • S
      Refactor association handling in `PredicateBuilder` · 3bbe88ec
      Sean Griffin 提交于
      I'm attempting to remove `klass` as a dependency of the predicate
      builder, in favor of an object that better represents what we're using
      it for. The only part of this which doesn't fit nicely into that picture
      is the check for an association being polymorphic. Since I'm not yet
      sure what that is going to look like, I've moved this logic into another
      class in an attempt to separate things that will change from things that
      won't.
      3bbe88ec
    • S
      Re-use the predicate builder in the `ArrayHandler` · 392a453b
      Sean Griffin 提交于
      This reduces the number of places which will need to care about single
      value or range specific logic as we introduce type casting. The array
      handler is only responsible for producing `in` statements.
      
      /cc @mrgilman
      
      [Sean Griffin & Melanie Gilman]
      392a453b
    • S
      Change `PredicateBuilder` handler methods to instance methods · a3936bbe
      Sean Griffin 提交于
      This will allow us to pass the predicate builder into the constructor of
      these handlers. The procs had to be changed to objects, because the
      `PredicateBuilder` needs to be marshalable. If we ever decide to make
      `register_handler` part of the public API, we should come up with a
      better solution which allows procs.
      
      /cc @mrgilman
      
      [Sean Griffin & Melanie Gilman]
      a3936bbe
    • S
      Add missing `:nodoc:` · af55197d
      Sean Griffin 提交于
      We're accidentally documenting `PredicateBuilder` and `ArrayHandler`
      since there's a constant which is missing `# :nodoc:`
      af55197d
    • S
      Inject the `PredicateBuilder` into the `Relation` instance · 1d6bb776
      Sean Griffin 提交于
      Construction of relations can be a hotspot, we don't want to create one
      of these in the constructor. This also allows us to do more expensive
      things in the predicate builder's constructor, since it's created once
      per AR::Base subclass
      1d6bb776
    • S
      Remove unused `@relation` instance variable · ed1a775d
      Sean Griffin 提交于
      We don't memoize the relation instance
      ed1a775d
    • B
      Propagate frozen state during transaction changes · c6fd2464
      brainopia 提交于
      c6fd2464
    • S
      Correctly ignore `case_sensitive` for UUID uniqueness validation · a983e1e8
      Sean Griffin 提交于
      I think we should deprecate this behavior and just error if you tell us
      to do a case insensitive comparison for types which are not case
      sensitive. Partially reverts 35592307
      
      Fixes #18195
      a983e1e8
  2. 26 12月, 2014 2 次提交
  3. 25 12月, 2014 2 次提交
  4. 24 12月, 2014 5 次提交
  5. 23 12月, 2014 11 次提交
    • M
      Fix connection leak when a thread checks in additional connections. · 5e024070
      Matt Jones 提交于
      The code in `ConnectionPool#release` assumed that a single thread only
      ever holds a single connection, and thus that releasing a connection
      only requires the owning thread_id.
      
      There is a trivial counterexample to this assumption: code that checks
      out additional connections from the pool in the same thread. For
      instance:
      
          connection_1 = ActiveRecord::Base.connection
          connection_2 = ActiveRecord::Base.connection_pool.checkout
          ActiveRecord::Base.connection_pool.checkin(connection_2)
          connection_3 = ActiveRecord::Base.connection
      
      At this point, connection_1 has been removed from the
      `@reserved_connections` hash, causing a NEW connection to be returned as
      connection_3 and the loss of any tracking info on connection_1. As long
      as the thread in this example lives, connection_1 will be inaccessible
      and un-reapable. If this block of code runs more times than the size of
      the connection pool in a single thread, every subsequent connection
      attempt will timeout, as all of the available connections have been
      leaked.
      
      Reverts parts of 9e457a86 and
      essentially all of 4367d2f0
      5e024070
    • Y
      docs, replace ` with + for proper rdoc output. [ci skip] · b5bfd6fe
      Yves Senn 提交于
      b5bfd6fe
    • Y
      ad783136
    • G
      Add information about "allow_destroy" requiring an ID. [ci skip] · 7476b90e
      George Millo 提交于
      I just wasted an absurd amount of time trying to figure out why my model
      wasn't being deleted even though I was setting `_destroy` to true like
      the instructions said. Making the documentation a little bit clear so
      that someone like me doesn't waste their time in future.
      7476b90e
    • M
      Clarify that the word present refers to Object#present?. [ci skip] · e3543268
      Michael D.W. Prendergast 提交于
      Update Active Record's attribute query methods documentation to clarify that whether an attribute is present is based on Object#present?. This gives people a place to go see what the exact definition of presence is. [ci skip]
      e3543268
    • D
      Fixing numeric attrs when set to same negative value · 2859341c
      Daniel Fox 提交于
      This bug occurs when an attribute of an ActiveRecord model is an
      ActiveRecord::Type::Integer type or a ActiveRecord::Type::Decimal type (or any
      other type that includes the ActiveRecord::Type::Numeric module. When the value
      of the attribute is negative and is set to the same negative value, it is marked
      as changed.
      
      Take the following example of a Person model with the integer attribute age:
      
          class Person < ActiveRecord::Base
            # age          :integer(4)
          end
      
      The following will produce the error:
      
          person = Person.new(age: -1)
          person.age = -1
          person.changes
          => { "age" => [-1, -1] }
          person.age_changed?
          => true
      
      The problematic line is here:
      
          module ActiveRecord
            module Type
              module Numeric
                ...
      
                def non_numeric_string?(value)
                  # 'wibble'.to_i will give zero, we want to make sure
                  # that we aren't marking int zero to string zero as
                  # changed.
                  value.to_s !~ /\A\d+\.?\d*\z/
                end
              end
            end
          end
      
      The regex match doesn't accept numbers with a leading '-'.
      2859341c
    • M
      Update Active Record's attribute query methods documentation to describe its... · 0ce7840b
      Michael D.W. Prendergast 提交于
      Update Active Record's attribute query methods documentation to describe its full behaviour. [ci skip]
      0ce7840b
    • G
      Don't raise on out-of-range datetimes passed by a user · d318badc
      Grey Baker 提交于
      d318badc
    • S
      Improve the performance of reading belongs_to associations · be2b98b4
      Sean Griffin 提交于
      `ActiveRecord::Base#[]` has overhead that was introduced in 4.2. The
      `foo["id"]` working with PKs other than ID isn't really a case that we
      want to support publicly, but deprecating was painful enough that we
      avoid it. `_read_attribute` was introduced as the faster alternative for
      use internally. By using that, we can save a lot of overhead. We also
      save some overhead by reading the attribute one fewer times in
      `stale_state`.
      
      Fixes #18151
      be2b98b4
    • S
      Don't perform statement caching for `find` when called from a scope · fb160f6e
      Sean Griffin 提交于
      If there is a method defined such as `find_and_do_stuff(id)`, which then
      gets called on an association, we will perform statement caching and the
      parent ID will not change on subsequent calls.
      
      Fixes #18117
      fb160f6e
    • S
      Don't calculate all in-place changes to determine if attribute_changed? · 18ae0656
      Sean Griffin 提交于
      Calling `changed_attributes` will ultimately check if every mutable
      attribute has changed in place. Since this gets called whenever an
      attribute is assigned, it's extremely slow. Instead, we can avoid this
      calculation until we actually need it.
      
      Fixes #18029
      18ae0656