rails/activerecord/CHANGELOG.md
Sean Griffin caa178c178 Ensure that inverse associations are set before running callbacks
If a parent association was accessed in an `after_find` or
`after_initialize` callback, it would always end up loading the
association, and then immediately overwriting the association we just
loaded. If this occurred in a way that the parent's `current_scope` was
set to eager load the child, this would result in an infinite loop and
eventually overflow the stack.

For records that are created with `.new`, we have a mechanism to
perform an action before the callbacks are run. I've introduced the same
code path for records created with `instantiate`, and updated all code
which sets inverse instances on newly loaded associations to use this
block instead.

Fixes #26320.
2016-08-31 09:26:25 -04:00

5.3 KiB

  • Inverse association instances will now be set before after_find or after_initialize callbacks are run.

    Fixes #26320.

    Sean Griffin

  • Remove unnecessarily association load when a belongs_to association has already been loaded then the foreign key is changed directly and the record saved.

    James Coleman

  • Remove standardized column types/arguments spaces in schema dump.

    Tim Petricola

  • Avoid loading records from database when they are already loaded using the pluck method on a collection.

    Fixes #25921.

    Ryuta Kamizono

  • Remove text default treated as an empty string in non-strict mode for consistency with other types.

    Strict mode controls how MySQL handles invalid or missing values in data-change statements such as INSERT or UPDATE. If strict mode is not in effect, MySQL inserts adjusted values for invalid or missing values and produces warnings.

    def test_mysql_not_null_defaults_non_strict
      using_strict(false) do
        with_mysql_not_null_table do |klass|
          record = klass.new
          assert_nil record.non_null_integer
          assert_nil record.non_null_string
          assert_nil record.non_null_text
          assert_nil record.non_null_blob
    
          record.save!
          record.reload
    
          assert_equal 0,  record.non_null_integer
          assert_equal "", record.non_null_string
          assert_equal "", record.non_null_text
          assert_equal "", record.non_null_blob
        end
      end
    end
    

    https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-strict

    Ryuta Kamizono

  • Sqlite3 migrations to add a column to an existing table can now be successfully rolled back when the column was given and invalid column type.

    Fixes #26087

    Travis O'Neill

  • Deprecate sanitize_conditions. Use sanitize_sql instead.

    Ryuta Kamizono

  • Doing count on relations that contain LEFT OUTER JOIN Arel node no longer force a DISTINCT. This solves issues when using count after a left_joins.

    Maxime Handfield Lapointe

  • RecordNotFound raised by association.find exposes id, primary_key and model methods to be consistent with RecordNotFound raised by Record.find.

    Michel Pigassou

  • Hashes can once again be passed to setters of composed_of, if all of the mapping methods are methods implemented on Hash.

    Fixes #25978.

    Sean Griffin

  • Fix the SELECT statement in #table_comment for MySQL.

    Takeshi Akima

  • Virtual attributes will no longer raise when read on models loaded from the database

    Sean Griffin

  • Support calling the method merge in scope's lambda.

    Yasuhiro Sugino

  • Fixes multi-parameter attributes conversion with invalid params.

    Hiroyuki Ishii

  • Add newline between each migration in structure.sql.

    Keeps schema migration inserts as a single commit, but allows for easier git diffing.

    Fixes #25504.

    Grey Baker, Norberto Lopes

  • The flag error_on_ignored_order_or_limit has been deprecated in favor of the current error_on_ignored_order.

    Xavier Noria

  • Batch processing methods support limit:

    Post.limit(10_000).find_each do |post|
      # ...
    end
    

    It also works in find_in_batches and in_batches.

    Xavier Noria

  • Using group with an attribute that has a custom type will properly cast the hash keys after calling a calculation method like count.

    Fixes #25595.

    Sean Griffin

  • Fix the generated #to_param method to use omission: '' so that the resulting output is actually up to 20 characters, not effectively 17 to leave room for the default "...". Also call #parameterize before #truncate and make the separator: /-/ to maximize the information included in the output.

    Fixes #23635.

    Rob Biedenharn

  • Ensure concurrent invocations of the connection reaper cannot allocate the same connection to two threads.

    Fixes #25585.

    Matthew Draper

  • Inspecting an object with an associated array of over 10 elements no longer truncates the array, preventing inspect from looping infinitely in some cases.

    Kevin McPhillips

  • Removed the unused methods ActiveRecord::Base.connection_id and ActiveRecord::Base.connection_id=.

    Sean Griffin

  • Ensure hashes can be assigned to attributes created using composed_of.

    Fixes #25210.

    Sean Griffin

  • Fix logging edge case where if an attribute was of the binary type and was provided as a Hash.

    Jon Moss

  • Handle JSON deserialization correctly if the column default from database adapter returns '' instead of nil.

    Johannes Opper

  • Introduce ActiveRecord::TransactionSerializationError for catching transaction serialization failures or deadlocks.

    Erol Fornoles

  • PostgreSQL: Fix db:structure:load silent failure on SQL error.

    The command line flag -v ON_ERROR_STOP=1 should be used when invoking psql to make sure errors are not suppressed.

    Example:

    psql -v ON_ERROR_STOP=1 -q -f awesome-file.sql my-app-db
    

    Fixes #23818.

    Ralin Chimev

Please check 5-0-stable for previous changes.