1. 04 6月, 2016 2 次提交
  2. 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
  3. 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
  4. 31 5月, 2016 4 次提交
    • 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
    • S
      Exists shouldn't error when used with `includes` · 02da8aea
      Sean Griffin 提交于
      Currently `exists?` does some hackery where it assumes that we can join
      onto anything that we passed to `eager_load` or `includes`, which
      doesn't work if we are joining onto a polymorphic association.
      
      Actually figuring out if we want to include something would require
      knowledge deep within the join dependency module, which is hard to pull
      up. The simplest solution is just to pass a flag down that says we're
      not actually going to try to eager load any of the data. It's not the
      solution I'd like, but that code really needs to be untangled before we
      can do much with it.
      
      This is another attempt at 6d5b1fdf which should address the concerns
      that led to reverting it in 4ecabed2.
      02da8aea
  5. 27 5月, 2016 1 次提交
  6. 25 5月, 2016 2 次提交
  7. 21 5月, 2016 1 次提交
  8. 19 5月, 2016 1 次提交
  9. 17 5月, 2016 1 次提交
    • J
      Keep state around for nested calls to #suppress · 25801cfe
      Jahfer Husain 提交于
      If a call to #suppress from the same class occurred inside another #suppress
      block, the suppression state would be set to false before the outer block
      completes.
      
      This change keeps the previous state around in memory and unwinds it
      as the blocks exit.
      25801cfe
  10. 15 5月, 2016 1 次提交
  11. 13 5月, 2016 2 次提交
  12. 12 5月, 2016 4 次提交
  13. 11 5月, 2016 3 次提交
    • A
      Dont cache the conn_spec_name when empty · f1030fd8
      Arthur Neves 提交于
      We cannot cache the connection_specification_name when it doesnt
      exist. Thats because the parent value could change, and we should keep
      failling back to the parent. If we cache that in a children as an ivar,
      we would not fallback anymore in the next call, so the children would
      not get the new parent spec_name.
      f1030fd8
    • A
      Make sure we reset the connection_specification_name on · d6f3ad7c
      Arthur Neves 提交于
      remove_connection
      
      When calling `remove_connection` on a model, we delete the pool so we also
      need to reset the `connection_specification_name` so it will fallback to
      the parent.
      This was the current behavior before rails 5, which will fallback to the
      parent connection pool.
      
      [fixes #24959]
      
      Special thanks to @jrafanie for working with me on this fix.
      d6f3ad7c
    • J
      Fix ActiveRecord::LogSubscriber edge case · c6503415
      Jon Moss 提交于
      If an attribute was of the binary type, and also was a Hash, it would
      previously not be logged, and instead raise an error saying that
      `bytesize` was not defined for the `attribute.value` (a `Hash`).
      
      Now, as is done on 4-2-stable, the attribute's database value is
      `bytesize`d, and then logged out to the terminal.
      
      Reproduction script:
      
      ```ruby
      require 'active_record'
      require 'minitest/autorun'
      require 'logger'
      
      ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
      ActiveRecord::Base.logger = Logger.new(STDOUT)
      
      ActiveRecord::Schema.define do
        create_table :posts, force: true do |t|
          t.binary :preferences
        end
      end
      
      class Post < ActiveRecord::Base
        serialize :preferences
      end
      
      class BugTest < Minitest::Test
        def test_24955
          Post.create!(preferences: {a: 1})
      
          assert_equal 1, Post.count
        end
      end
      ```
      c6503415
  14. 10 5月, 2016 1 次提交
  15. 07 5月, 2016 3 次提交
  16. 06 5月, 2016 6 次提交
  17. 05 5月, 2016 1 次提交
  18. 04 5月, 2016 1 次提交
  19. 03 5月, 2016 1 次提交
    • S
      Do not delegate `AR::Base#empty?` to `all` · 98264a13
      Sean Griffin 提交于
      Unlike `one?` and `none?`, `empty?` has interactions with methods
      outside of enumerable. It also doesn't fit in the same vein.
      `Topic.any?` makes sense. `Topic.empty?` does not, as `Topic` is not a
      container.
      
      Fixes #24808
      Close #24812
      98264a13