1. 27 12月, 2014 12 次提交
    • 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 16 次提交
    • 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
    • S
      Add `foreign_key` as an option to `references` for `change_table` · 82afeaf2
      Sean Griffin 提交于
      This has the same comments as 9af90ffa00ba35bdee888e3e1ab775ba0bdbe72c,
      however it affects the `add_reference` method, and `t.references` in the
      context of a `change_table` block.
      
      There is a lot of duplication of code between creating and updating
      tables. We should re-evaluate the structure of this code from a high
      level so changes like this don't need to be made in two places. (Note to
      self)
      82afeaf2
    • S
      Convert `add_references` to use kwargs · 68a6c8ec
      Sean Griffin 提交于
      While we still aren't accepting PRs that only make changes like this,
      it's fine when we're actively working on a method if it makes our lives
      easier.
      68a6c8ec
    • S
      Add a `foreign_key` option to `references` while creating the table · 99a6f9e6
      Sean Griffin 提交于
      Rather than having to do:
      
          create_table :posts do |t|
            t.references :user
          end
      
          add_foreign_key :posts, :users
      
      You can instead do:
      
          create_table :posts do |t|
            t.references :user, foreign_key: true
          end
      
      Similar to the `index` option, you can also pass a hash. This will be
      passed as the options to `add_foreign_key`. e.g.:
      
          create_table :posts do |t|
            t.references :user, foreign_key: { primary_key: :other_id }
          end
      
      is equivalent to
      
          create_table :posts do |t|
            t.references :user
          end
      
          add_foreign_key :posts, :users, primary_key: :other_id
      99a6f9e6
    • S
      Convert `references` to kwargs · a9c0c462
      Sean Griffin 提交于
      While we aren't taking PRs with these kinds of changes just yet, they
      are fine if we're actively working on the method and it makes things
      easier.
      a9c0c462
    • S
      Correctly handle limit on int4 and int8 types in PG · b0f2b94d
      Sean Griffin 提交于
      PG doesn't register it's types using the `int(4)` format that others do.
      As such, if we alias `int8` to the other integer types, the range
      information is lost. This is fixed by simply registering it separately.
      
      The other option (which I specifically chose to avoid) is to pass the
      information of the original type that was being aliased as an argument.
      I'd rather avoid that, since an alias should truly be treated the same.
      If we need different behavior for a different type, we should explicitly
      register it with that, and not have a conditional based on aliasing.
      
      Fixes #18144
      
      [Sean Griffin & ysbaddaden]
      b0f2b94d
  6. 22 12月, 2014 1 次提交
  7. 21 12月, 2014 1 次提交
  8. 20 12月, 2014 1 次提交