1. 13 7月, 2016 1 次提交
    • J
      Create connection.active_record notification and use that to ensure that lazy- · 31a8588a
      Jeremy Wadsack 提交于
      loaded model classes have their connections wrapped in transactions.
      
      See #17776
      
      In Rails 4 config.eager_load was changed to false in the test environment. This
      means that model classes that connect to alternate databases with
      establish_connection are not loaded at start up. If use_transactional_fixtures
      is enabled, transactions are wrapped around the connections that have been
      established only at the start of the test suite. So model classes loaded later
      don't have transactions causing data created in the alternate database not to
      be removed.
      
      This change resolves that by creating a new connection.active_record
      notification that gets fired whenever a connection is established. I then added
      a subscriber after we set up transactions in the test environment to listen for
      additional connections and wrap those in transactions as well.
      31a8588a
  2. 12 7月, 2016 1 次提交
  3. 11 7月, 2016 1 次提交
    • S
      Always prefer class types to query types when casting `group` · a45363a2
      Sean Griffin 提交于
      When `group` is used in combination with any calculation method, the
      resulting hash uses the grouping expression as the key. Currently we're
      incorrectly always favoring the type reported by the query, instead of
      the type known by the class. This causes differing behavior depending on
      whether the adaptor actually gives proper types with the query or not.
      After this change, the behavior will be the same on all adaptors -- we
      see if we know the type from the class, fall back to the type from the
      query, and finally fall back to the identity type.
      
      Fixes #25595
      a45363a2
  4. 09 7月, 2016 1 次提交
    • R
      fix to_param to maximize content · 3b49d792
      Rob Biedenharn 提交于
      The documentation states that parameter values longer than 20 characters
      will be truncated by words, but the example shows that a parameter based
      on "David Heinemeier Hansson" (with id: 125) becomes "125-david" when
      "David Heinemeier".length == 16 so why so short?
      
      The answer lies in the use of the #truncate option omission: nil which
      seems to have been intended to mean "nothing", but which actually causes
      the default string "..." to be used. This causes #truncate to cleave
      words until the "..." can be added and still remain within the requested
      size of 20 characters.
      
      The better option is omission: '' (which is probably what was originally
      intended).
      
      Furthermore, since the use of #parameterize will remove non-alphanumeric
      characters, we can maximize the useful content of the output by calling
      parameterize first and then giving truncate a separator: /-/ rather than
      a space.
      3b49d792
  5. 06 7月, 2016 1 次提交
  6. 03 7月, 2016 2 次提交
  7. 02 7月, 2016 1 次提交
  8. 01 7月, 2016 2 次提交
  9. 29 6月, 2016 2 次提交
  10. 25 6月, 2016 1 次提交
  11. 24 6月, 2016 4 次提交
  12. 16 6月, 2016 2 次提交
    • R
      Fix `Type::Date#serialize` to return a date object correctly · 10b81fb5
      Ryuta Kamizono 提交于
      Currently `Type::Date#serialize` does not cast a value to a date object.
      It should be cast to a date object for finding by date column correctly
      working.
      
      Fixes #25354.
      10b81fb5
    • R
      Prevent `RangeError` for `FinderMethods#exists?` · 1cf467b7
      Ryuta Kamizono 提交于
      `FinderMethods#exists?` should return a boolean rather than raising an
      exception.
      
      `UniquenessValidator#build_relation` catches a `RangeError` because it
      includes type casting due to a string value truncation. But a string
      value truncation was removed at #23523 then type casting in
      `build_relation` is no longer necessary. aa062318 removes type casting in
      `build_relation` then a `RangeError` moves to `relation.exists?`.
      
      This change will remove the catching a `RangeError`.
      1cf467b7
  13. 15 6月, 2016 3 次提交
  14. 13 6月, 2016 1 次提交
  15. 12 6月, 2016 2 次提交
  16. 11 6月, 2016 1 次提交
  17. 09 6月, 2016 3 次提交
  18. 07 6月, 2016 1 次提交
  19. 04 6月, 2016 2 次提交
  20. 02 6月, 2016 3 次提交
    • S
      Ensure that records with unselected fields can be updated · c587b636
      Sean Griffin 提交于
      As part of refactoring mutation detection to be more performant, we
      introduced the concept of `original_value` to `Attribute`. This was not
      overridden in `Attribute::Uninitialized` however, so assigning ot an
      uninitialized value and calling `.changed?` would raise
      `NotImplementedError`.
      
      We are using a sentinel value rather than checking the result of
      `original_attribute.initialized?` in `changed?` because `original_value`
      might go through more than one node in the tree.
      
      Fixes #25228
      c587b636
    • S
      Fix failing tests · 1b8a7b82
      Sean Griffin 提交于
      Currently CI is broken due to 56a61e0c and c4cb6862. This occurred because
      the failures are not present on SQLite which is what I normally run
      locally before pushing.
      
      The optimizations to our YAML size were dropping mutations, as
      `with_type` didn't set the previous value if it'd already been read
      (that method was never really designed to be used with values on
      individual objects, it was previously only used for defaults). I'm
      questioning whether there's a better place to be handling the exclusion
      of the type, but this will fix the failing build.
      
      Additionally, there was a bug in `remove_foreign_key` if you passed it
      an options hash containing `to_table`. This now occurs whenever removing
      a reference, as we always normalize to a hash.
      
      [Sean Griffin & Ryuta Kamizono]
      1b8a7b82
    • S
      Add i18n_validation_test · 3bd30d98
      sukesan1984 提交于
      add active record uniqueness validation test for { on: [:create, :update] } condition.
      3bd30d98
  21. 01 6月, 2016 2 次提交
    • S
      Make Active Record emit significantly smaller YAML · c4cb6862
      Sean Griffin 提交于
      This reduces the size of a YAML encoded Active Record object by ~80%
      depending on the number of columns. There were a number of wasteful
      things that occurred when we encoded the objects before that have
      resulted in numerous wins
      
      - We were emitting the result of `attributes_before_type_cast` as a hack
        to work around some laziness issues
      - The name of an attribute was emitted multiple times, since the
        attribute objects were in a hash keyed by the name. We now store them
        in an array instead, and reconstruct the hash using the name
      - The types were included for every attribute. This would use backrefs
        if multiple objects were encoded, but really we don't need to include
        it at all unless it differs from the type at the class level. (The
        only time that will occur is if the field is the result of a custom
        select clause)
      - `original_attribute:` was included over and over and over again since
        the ivar is almost always `nil`. We've added a custom implementation
        of `encode_with` on the attribute objects to ensure we don't write the
        key when the field is `nil`.
      
      This isn't without a cost though. Since we're no longer including the
      types, an object can find itself in an invalid state if the type changes
      on the class after serialization. This is the same as 4.1 and earlier,
      but I think it's worth noting.
      
      I was worried that I'd introduce some new state bugs as a result of
      doing this, so I've added an additional test that asserts mutation not
      being lost as the result of YAML round tripping.
      
      Fixes #25145
      c4cb6862
    • S
      Respect options passed to `foreign_key` when reverting `add_reference` · 56a61e0c
      Sean Griffin 提交于
      The code incorrectly assumes that the option was written as
      `foreign_key: true`, but that is not always the case. This now mirrors
      the behavior of reverting `add_foreign_key`. The code was changed to use
      kwargs while I was touching it, as well.
      
      This could really use a refactoring to go through the same code paths as
      `add_refernce` in the future, so we don't duplicate default values.
      
      Fixes #25169
      56a61e0c
  22. 31 5月, 2016 3 次提交
    • S
      `ActiveRecord::Base#hash` should differ between classes · c8be4574
      Sean Griffin 提交于
      Prior to this change, we would get collisions if Active Record objects
      of different classes with the same ID were used as keys of the same
      hash. It bothers me slightly that we have to allocate inside of this
      method, but Ruby doesn't provide any way to hash multiple values without
      allocation
      c8be4574
    • R
      Do not include default column limit in schema.rb · 706f7e9c
      Ryuta Kamizono 提交于
      Follow up of #20815.
      
      ```ruby
      class CreatePeople < ActiveRecord::Migration[5.0]
        def change
          create_table :people do |t|
            t.integer :int
            t.bigint :bint
            t.text :txt
            t.binary :bin
          end
        end
      end
      ```
      
      Result.
      
      In postgresql and sqlite3 adapters:
      
      ```ruby
      ActiveRecord::Schema.define(version: 20160531141018) do
      
        create_table "people", force: :cascade do |t|
          t.integer "int"
          t.bigint  "bint"
          t.text    "txt"
          t.binary  "bin"
        end
      
      end
      ```
      
      In mysql2 adapter:
      
      ```ruby
      ActiveRecord::Schema.define(version: 20160531141018) do
      
        create_table "people", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" do |t|
          t.integer "int"
          t.bigint  "bint"
          t.text    "txt",  limit: 65535
          t.binary  "bin",  limit: 65535
        end
      
      end
      ```
      
      After this patch:
      
      ```ruby
      ActiveRecord::Schema.define(version: 20160531141018) do
      
        create_table "people", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" do |t|
          t.integer "int"
          t.bigint  "bint"
          t.text    "txt"
          t.binary  "bin"
        end
      
      end
      ```
      706f7e9c
    • S
      Ensure hashes can be passed to attributes using `composed_of` · ff4986b9
      Sean Griffin 提交于
      This behavior was broken by 36e9be85. When the value is assigned
      directly, either through mass assignment or directly assigning a hash,
      the hash gets passed through to this writer method directly. While this
      is intended to handle certain cases, when an explicit converter has been
      provided, we should continue to use that instead. The positioning of the
      added guard caused the new behavior to override that case.
      
      Fixes #25210
      ff4986b9