CHANGELOG.md 43.2 KB
Newer Older
1
## Rails 4.0.0 (unreleased) ##
R
Rafael Mendonça França 已提交
2

3 4 5 6 7 8 9 10 11 12
*   Quote numeric values being compared to non-numeric columns. Otherwise,
    in some database, the string column values will be coerced to a numeric
    allowing 0, 0.0 or false to match any string starting with a non-digit.

    Example:

        App.where(apikey: 0) # => SELECT * FROM users WHERE apikey = '0'

    *Dylan Smith*

13 14 15 16 17
*   Schema dumper supports dumping the enabled database extensions to `schema.rb`
    (currently only supported by postgresql).

    *Justin George*

R
Rafael Mendonça França 已提交
18
*   The `DATABASE_URL` environment variable now converts ints, floats, and
19 20 21 22 23 24 25 26 27 28 29
    the strings true and false to Ruby types. For example, SQLite requires
    that the timeout value is an integer, and PostgreSQL requires that the
    prepared_statements option is a boolean. These now work as expected:

    Example:

        DATABASE_URL=sqlite3://localhost/test_db?timeout=500
        DATABASE_URL=postgresql://localhost/test_db?prepared_statements=false

    *Aaron Stone*

R
Rafael Mendonça França 已提交
30
*   `Relation#merge` now only overwrites where values on the LHS of the
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
    merge. Consider:

        left  = Person.where(age: [13, 14, 15])
        right = Person.where(age: [13, 14]).where(age: [14, 15])

    `left` results in the following SQL:

        WHERE age IN (13, 14, 15)

    `right` results in the following SQL:

        WHERE age IN (13, 14) AND age IN (14, 15)

    Previously, `left.merge(right)` would result in all but the last
    condition being removed:

        WHERE age IN (14, 15)

    Now it results in the LHS condition(s) for `age` being removed, but
    the RHS remains as it is:

        WHERE age IN (13, 14) AND age IN (14, 15)

    *Jon Leighton*

56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
*   Fix handling of dirty time zone aware attributes

    Previously, when `time_zone_aware_attributes` were enabled, after
    changing a datetime or timestamp attribute and then changing it back
    to the original value, `changed_attributes` still tracked the
    attribute as changed. This caused `[attribute]_changed?` and
    `changed?` methods to return true incorrectly.

    Example:

        in_time_zone 'Paris' do
          order = Order.new
          original_time = Time.local(2012, 10, 10)
          order.shipped_at = original_time
          order.save
          order.changed? # => false

          # changing value
          order.shipped_at = Time.local(2013, 1, 1)
          order.changed? # => true

          # reverting to original value
          order.shipped_at = original_time
          order.changed? # => false, used to return true
        end

    *Lilibeth De La Cruz*

84 85 86 87 88
*   When `#count` is used in conjunction with `#uniq` we perform `count(:distinct => true)`.
    Fix #6865.

    Example:

R
Rafael Mendonça França 已提交
89
        relation.uniq.count # => SELECT COUNT(DISTINCT *)
90 91 92

    *Yves Senn + Kaspar Schiess*

B
bUg 已提交
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
*   PostgreSQL ranges type support. Includes: int4range, int8range,
    numrange, tsrange, tstzrange, daterange

    Ranges can be created with inclusive and exclusive bounds.

    Example:

        create_table :Room do |t|
          t.daterange :availability
        end

        Room.create(availability: (Date.today..Float::INFINITY))
        Room.first.availability # => Wed, 19 Sep 2012..Infinity

    One thing to note: Range class does not support exclusive lower
    bound.

    *Alexander Grebennik*

W
wangjohn 已提交
112 113 114 115 116
*   Added a state instance variable to each transaction. Will allow other objects
    to know whether a transaction has been committed or rolled back.

    *John Wang*

117 118 119 120 121 122 123 124 125 126 127
*   Collection associations `#empty?` always respects builded records.
    Fix #8879.

    Example:

        widget = Widget.new
        widget.things.build
        widget.things.empty? # => false

    *Yves Senn*

128 129 130 131
*   Remove support for parsing YAML parameters from request.

    *Aaron Patterson*

132
*   Support for PostgreSQL's `ltree` data type.
133 134 135

    *Rob Worley*

136
*   Fix undefined method `to_i` when calling `new` on a scope that uses an
137 138
    Array; Fix FloatDomainError when setting integer column to NaN.
    Fixes #8718, #8734, #8757.
139

140
    *Jason Stirk + Tristan Harward*
141 142

*   Rename `update_attributes` to `update`, keep `update_attributes` as an alias for `update` method.
143 144 145
    This is a soft-deprecation for `update_attributes`, although it will still work without any
    deprecation message in 4.0 is recommended to start using `update` since `update_attributes` will be
    deprecated and removed in future versions of Rails.
146

147 148
    *Amparo Luna + Guillermo Iguaran*

149
*   `after_commit` and `after_rollback` now validate the `:on` option and raise an `ArgumentError`
150
    if it is not one of `:create`, `:destroy` or `:update`
151 152 153

    *Pascal Friederich*

154 155 156 157 158 159 160 161 162 163 164 165 166
*   Improve ways to write `change` migrations, making the old `up` & `down` methods no longer necessary.

    * The methods `drop_table` and `remove_column` are now reversible, as long as the necessary information is given.
      The method `remove_column` used to accept multiple column names; instead use `remove_columns` (which is not revertible).
      The method `change_table` is also reversible, as long as its block doesn't call `remove`, `change` or `change_default`

    * New method `reversible` makes it possible to specify code to be run when migrating up or down.
      See the [Guide on Migration](https://github.com/rails/rails/blob/master/guides/source/migrations.md#using-the-reversible-method)

    * New method `revert` will revert a whole migration or the given block.
      If migrating down, the given migration / block is run normally.
      See the [Guide on Migration](https://github.com/rails/rails/blob/master/guides/source/migrations.md#reverting-previous-migrations)

167 168
    Attempting to revert the methods `execute`, `remove_columns` and `change_column` will now
    raise an `IrreversibleMigration` instead of actually executing them without any output.
169 170 171

    *Marc-André Lafortune*

172 173 174 175 176
*   Serialized attributes can be serialized in integer columns.
    Fix #8575.

    *Rafael Mendonça França*

177
*   Keep index names when using `alter_table` with sqlite3.
178
    Fix #3489.
179 180 181

    *Yves Senn*

182
*   Add ability for postgresql adapter to disable user triggers in `disable_referential_integrity`.
183
    Fix #5523.
184 185 186

    *Gary S. Weaver*

187 188 189 190 191
*   Added support for `validates_uniqueness_of` in PostgreSQL array columns.
    Fixes #8075.

    *Pedro Padron*

192 193 194 195
*   Allow int4range and int8range columns to be created in PostgreSQL and properly convert to/from database.

    *Alexey Vasiliev aka leopard*

196 197 198 199
*   Do not log the binding values for binary columns.

    *Matthew M. Boedicker*

200 201 202 203 204
*   Fix counter cache columns not updated when replacing `has_many :through`
    associations.

    *Matthew Robertson*

205 206 207 208 209
*   Recognize migrations placed in directories containing numbers and 'rb'.
    Fix #8492

    *Yves Senn*

210 211 212 213 214 215 216
*   Add `ActiveRecord::Base.cache_timestamp_format` class attribute to control
    the format of the timestamp value in the cache key.
    This allows users to improve the precision of the cache key.
    Fixes #8195.

    *Rafael Mendonça França*

217 218 219 220
*   Add `:nsec` date format. This can be used to improve the precision of cache key.

    *Jamie Gaskins*

221 222 223 224 225 226 227 228
*   Session variables can be set for the `mysql`, `mysql2`, and `postgresql` adapters
    in the `variables: <hash>` parameter in `database.yml`. The key-value pairs of this
    hash will be sent in a `SET key = value` query on new database connections. See also:
    http://dev.mysql.com/doc/refman/5.0/en/set-statement.html
    http://www.postgresql.org/docs/8.3/static/sql-set.html

    *Aaron Stone*

229
*   Allow `Relation#where` with no arguments to be chained with new `not` query method.
230 231 232

    Example:

233
        Developer.where.not(name: 'Aaron')
234 235 236

    *Akira Matsuda*

237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
*   Unscope `update_column(s)` query to ignore default scope.

    When applying `default_scope` to a class with a where clause, using
    `update_column(s)` could generate a query that would not properly update
    the record due to the where clause from the `default_scope` being applied
    to the update query.

        class User < ActiveRecord::Base
          default_scope where(active: true)
        end

        user = User.first
        user.active = false
        user.save!

        user.update_column(:active, true) # => false

    In this situation we want to skip the default_scope clause and just
    update the record based on the primary key. With this change:

        user.update_column(:active, true) # => true

    Fixes #8436.

    *Carlos Antonio da Silva*

C
Carlos Antonio da Silva 已提交
263 264
*   SQLite adapter no longer corrupts binary data if the data contains `%00`.

S
Steve Klabnik 已提交
265 266
    *Chris Feist*

C
Carlos Antonio da Silva 已提交
267 268
*   Fix performance problem with `primary_key` method in PostgreSQL adapter when having many schemas.
    Uses `pg_constraint` table instead of `pg_depend` table which has many records in general.
269 270 271 272
    Fix #8414

    *kennyj*

273 274 275 276 277 278
*   Do not instantiate intermediate Active Record objects when eager loading.
    These records caused `after_find` to run more than expected.
    Fix #3313

    *Yves Senn*

279
*   Add STI support to init and building associations.
280 281
    Allows you to do `BaseClass.new(type: "SubClass")` as well as
    `parent.children.build(type: "SubClass")` or `parent.build_child`
282 283 284 285 286 287
    to initialize an STI subclass. Ensures that the class name is a
    valid class and that it is in the ancestors of the super class
    that the association is expecting.

    *Jason Rush*

288 289 290 291
*   Observers was extracted from Active Record as `rails-observers` gem.

    *Rafael Mendonça França*

292 293
*   Ensure that associations take a symbol argument. *Steve Klabnik*

294
*   Fix dirty attribute checks for `TimeZoneConversion` with nil and blank
295 296 297 298 299
    datetime attributes. Setting a nil datetime to a blank string should not
    result in a change being flagged. Fix #8310

    *Alisdair McDiarmid*

300 301 302 303 304
*   Prevent mass assignment to the type column of polymorphic associations when using `build`
    Fix #8265

    *Yves Senn*

305 306 307 308 309
*   Deprecate calling `Relation#sum` with a block. To perform a calculation over
    the array result of the relation, use `to_a.sum(&block)`.

    *Carlos Antonio da Silva*

310 311
*   Fix postgresql adapter to handle BC timestamps correctly

312
        HistoryEvent.create!(name: "something", occured_at: Date.new(0) - 5.years)
313 314 315

    *Bogdan Gusiev*

316 317 318 319 320
*   When running migrations on Postgresql, the `:limit` option for `binary` and `text` columns is silently dropped.
    Previously, these migrations caused sql exceptions, because Postgresql doesn't support limits on these types.

    *Victor Costan*

321 322
*   Don't change STI type when calling `ActiveRecord::Base#becomes`.
    Add `ActiveRecord::Base#becomes!` with the previous behavior.
323

324
    See #3023 for more information.
325 326 327

    *Thomas Hollstegge*

J
Jarek Radosz 已提交
328 329 330 331 332 333 334 335
*   `rename_index` can be used inside a `change_table` block.

        change_table :accounts do |t|
          t.rename_index :user_id, :account_id
        end

    *Jarek Radosz*

336
*   `#pluck` can be used on a relation with `select` clause. Fix #7551
337

338
    Example:
339 340 341

        Topic.select([:approved, :id]).order(:id).pluck(:id)

342
    *Yves Senn*
343

344
*   Do not create useless database transaction when building `has_one` association.
345

346 347 348 349 350 351 352
    Example:

        User.has_one :profile
        User.new.build_profile

    *Bogdan Gusiev*

353
*   `:counter_cache` option for `has_many` associations to support custom named counter caches.
354 355 356 357
    Fix #7993

    *Yves Senn*

358 359 360 361 362 363 364
*   Deprecate the possibility to pass a string as third argument of `add_index`.
    Pass `unique: true` instead.

        add_index(:users, :organization_id, unique: true)

    *Rafael Mendonça França*

365 366 367 368
*   Raise an `ArgumentError` when passing an invalid option to `add_index`.

    *Rafael Mendonça França*

369 370 371 372
*   Fix `find_in_batches` crashing when IDs are strings and start option is not specified.

    *Alexis Bernard*

373 374 375 376
*   `AR::Base#attributes_before_type_cast` now returns unserialized values for serialized attributes.

    *Nikita Afanasenko*

377
*   Use query cache/uncache when using `DATABASE_URL`.
378 379 380 381
    Fix #6951.

    *kennyj*

382 383 384 385 386
*   Added `#none!` method for mutating `ActiveRecord::Relation` objects to a NullRelation.
    It acts like `#none` but modifies relation in place.

    *Juanjo Bazán*

387 388 389 390
*   Fix bug where `update_columns` and `update_column` would not let you update the primary key column.

    *Henrik Nyh*

391 392 393 394 395
*   The `create_table` method raises an `ArgumentError` when the primary key column is redefined.
    Fix #6378

    *Yves Senn*

396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418
*   `ActiveRecord::AttributeMethods#[]` raises `ActiveModel::MissingAttributeError`
    error if the given attribute is missing. Fixes #5433.

        class Person < ActiveRecord::Base
          belongs_to :company
        end

        # Before:
        person = Person.select('id').first
        person[:name]       # => nil
        person.name         # => ActiveModel::MissingAttributeError: missing_attribute: name
        person[:company_id] # => nil
        person.company      # => nil

        # After:
        person = Person.select('id').first
        person[:name]       # => ActiveModel::MissingAttributeError: missing_attribute: name
        person.name         # => ActiveModel::MissingAttributeError: missing_attribute: name
        person[:company_id] # => ActiveModel::MissingAttributeError: missing_attribute: company_id
        person.company      # => ActiveModel::MissingAttributeError: missing_attribute: company_id

    *Francesco Rodriguez*

419 420 421 422
*   Small binary fields use the `VARBINARY` MySQL type, instead of `TINYBLOB`.

    *Victor Costan*

423 424 425 426
*   Decode URI encoded attributes on database connection URLs.

    *Shawn Veader*

427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450
*   Add `find_or_create_by`, `find_or_create_by!` and
    `find_or_initialize_by` methods to `Relation`.

    These are similar to the `first_or_create` family of methods, but
    the behaviour when a record is created is slightly different:

        User.where(first_name: 'Penélope').first_or_create

    will execute:

        User.where(first_name: 'Penélope').create

    Causing all the `create` callbacks to execute within the context of
    the scope. This could affect queries that occur within callbacks.

        User.find_or_create_by(first_name: 'Penélope')

    will execute:

        User.create(first_name: 'Penélope')

    Which obviously does not affect the scoping of queries within
    callbacks.

451 452 453 454 455 456 457 458 459 460 461
    The `find_or_create_by` version also reads better, frankly.

    If you need to add extra attributes during create, you can do one of:

        User.create_with(active: true).find_or_create_by(first_name: 'Jon')
        User.find_or_create_by(first_name: 'Jon') { |u| u.active = true }

    The `first_or_create` family of methods have been nodoc'ed in favour
    of this API. They may be deprecated in the future but their
    implementation is very small and it's probably not worth putting users
    through lots of annoying deprecation warnings.
462 463 464

    *Jon Leighton*

465
*   Fix bug with presence validation of associations. Would incorrectly add duplicated errors
466 467 468 469
    when the association was blank. Bug introduced in 1fab518c6a75dac5773654646eb724a59741bc13.

    *Scott Willson*

470
*   Fix bug where sum(expression) returns string '0' for no matching records.
471 472 473 474
    Fixes #7439

    *Tim Macfarlane*

475 476 477 478
*   PostgreSQL adapter correctly fetches default values when using multiple schemas and domains in a db. Fixes #7914

    *Arturo Pie*

479 480 481 482
*   Learn ActiveRecord::QueryMethods#order work with hash arguments

    When symbol or hash passed we convert it to Arel::Nodes::Ordering.
    If we pass invalid direction(like name: :DeSc) ActiveRecord::QueryMethods#order will raise an exception
483

484 485 486 487 488
        User.order(:name, email: :desc)
        # SELECT "users".* FROM "users" ORDER BY "users"."name" ASC, "users"."email" DESC

    *Tima Maslyuchenko*

489 490 491 492 493 494 495 496 497 498 499 500
*   Rename `ActiveRecord::Fixtures` class to `ActiveRecord::FixtureSet`.
    Instances of this class normally hold a collection of fixtures (records)
    loaded either from a single YAML file, or from a file and a folder
    with the same name.  This change make the class name singular and makes
    the class easier to distinguish from the modules like
    `ActiveRecord::TestFixtures`, which operates on multiple fixture sets,
    or `DelegatingFixtures`, `::Fixtures`, etc.,
    and from the class `ActiveRecord::Fixture`, which corresponds to a single
    fixture.

    *Alexey Muranov*

501 502 503 504 505
*   The postgres adapter now supports tables with capital letters.
    Fix #5920

    *Yves Senn*

506 507
*   `CollectionAssociation#count` returns `0` without querying if the
    parent record is not persisted.
508 509 510

    Before:

511
        person.pets.count
512 513 514 515 516
        # SELECT COUNT(*) FROM "pets" WHERE "pets"."person_id" IS NULL
        # => 0

    After:

517
        person.pets.count
518 519 520 521 522
        # fires without sql query
        # => 0

    *Francesco Rodriguez*

523 524 525 526 527
*   Fix `reset_counters` crashing on `has_many :through` associations.
    Fix #7822.

    *lulalala*

J
Jon Leighton 已提交
528 529 530 531 532 533 534 535 536 537 538
*   Support for partial inserts.

    When inserting new records, only the fields which have been changed
    from the defaults will actually be included in the INSERT statement.
    The other fields will be populated by the database.

    This is more efficient, and also means that it will be safe to
    remove database columns without getting subsequent errors in running
    app processes (so long as the code in those processes doesn't
    contain any references to the removed column).

539 540 541 542
    The `partial_updates` configuration option is now renamed to
    `partial_writes` to reflect the fact that it now impacts both inserts
    and updates.

J
Jon Leighton 已提交
543 544
    *Jon Leighton*

545 546 547 548
*   Allow before and after validations to take an array of lifecycle events

    *John Foley*

549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
*   Support for specifying transaction isolation level

    If your database supports setting the isolation level for a transaction, you can set
    it like so:

        Post.transaction(isolation: :serializable) do
          # ...
        end

    Valid isolation levels are:

    * `:read_uncommitted`
    * `:read_committed`
    * `:repeatable_read`
    * `:serializable`

    You should consult the documentation for your database to understand the
    semantics of these different levels:

    * http://www.postgresql.org/docs/9.1/static/transaction-iso.html
    * https://dev.mysql.com/doc/refman/5.0/en/set-transaction.html

    An `ActiveRecord::TransactionIsolationError` will be raised if:

    * The adapter does not support setting the isolation level
    * You are joining an existing open transaction
    * You are creating a nested (savepoint) transaction

    The mysql, mysql2 and postgresql adapters support setting the transaction
    isolation level. However, support is disabled for mysql versions below 5,
    because they are affected by a bug (http://bugs.mysql.com/bug.php?id=39170)
    which means the isolation level gets persisted outside the transaction.

    *Jon Leighton*

584 585 586 587 588 589 590 591 592 593
*   `ActiveModel::ForbiddenAttributesProtection` is included by default
    in Active Record models. Check the docs of `ActiveModel::ForbiddenAttributesProtection`
    for more details.

    *Guillermo Iguaran*

*   Remove integration between Active Record and
    `ActiveModel::MassAssignmentSecurity`, `protected_attributes` gem
    should be added to use `attr_accessible`/`attr_protected`. Mass
    assignment options has been removed from all the AR methods that
594
    used it (ex. `AR::Base.new`, `AR::Base.create`, `AR::Base#update_attributes`, etc).
595 596 597

    *Guillermo Iguaran*

598 599 600 601 602 603 604 605 606 607 608
*   Fix the return of querying with an empty hash.
    Fix #6971.

        User.where(token: {})

    Before:

        #=> SELECT * FROM users;

    After:

609
        #=> SELECT * FROM users WHERE 1=0;
610 611

    *Damien Mathieu*
D
Damien Mathieu 已提交
612

613 614 615
*   Fix creation of through association models when using `collection=[]`
    on a `has_many :through` association from an unsaved model.
    Fix #7661.
616 617 618

    *Ernie Miller*

K
kennyj 已提交
619
*   Explain only normal CRUD sql (select / update / insert / delete).
620 621
    Fix problem that explains unexplainable sql.
    Closes #7544 #6458.
K
kennyj 已提交
622 623 624

    *kennyj*

M
Matt Jones 已提交
625 626 627 628 629 630
*   You can now override the generated accessor methods for stored attributes
    and reuse the original behavior with `read_store_attribute` and `write_store_attribute`,
    which are counterparts to `read_attribute` and `write_attribute`.

    *Matt Jones*

631
*   Accept `belongs_to` (including polymorphic) association keys in queries.
632 633 634

    The following queries are now equivalent:

635 636
        Post.where(author: author)
        Post.where(author_id: author)
637

638 639
        PriceEstimate.where(estimate_of: treasure)
        PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: treasure)
640 641 642

    *Peter Brown*

643 644 645 646 647
*   Use native `mysqldump` command instead of `structure_dump` method
    when dumping the database structure to a sql file. Fixes #5547.

    *kennyj*

648
*   PostgreSQL inet and cidr types are converted to `IPAddr` objects.
649

650 651 652 653 654 655 656 657
    *Dan McClain*

*   PostgreSQL array type support. Any datatype can be used to create an
    array column, with full migration and schema dumper support.

    To declare an array column, use the following syntax:

        create_table :table_with_arrays do |t|
658
          t.integer :int_array, array: true
659
          # integer[]
660
          t.integer :int_array, array: true, length: 2
661
          # smallint[]
662
          t.string :string_array, array: true, length: 30
663
          # char varying(30)[]
664
        end
665

666
    This respects any other migration detail (limits, defaults, etc).
X
Xavier Noria 已提交
667
    Active Record will serialize and deserialize the array columns on
668 669 670 671 672 673 674 675
    their way to and from the database.

    One thing to note: PostgreSQL does not enforce any limits on the
    number of elements, and any array can be multi-dimensional. Any
    array that is multi-dimensional must be rectangular (each sub array
    must have the same number of elements as its siblings).

    If the `pg_array_parser` gem is available, it will be used when
676
    parsing PostgreSQL's array representation.
677 678 679

    *Dan McClain*

680 681
*   Attribute predicate methods, such as `article.title?`, will now raise
    `ActiveModel::MissingAttributeError` if the attribute being queried for
682
    truthiness was not read from the database, instead of just returning `false`.
683 684 685

    *Ernie Miller*

686 687 688 689
*   `ActiveRecord::SchemaDumper` uses Ruby 1.9 style hash, which means that the
    schema.rb file will be generated using this new syntax from now on.

    *Konstantin Shabanov*
690

691 692 693
*   Map interval with precision to string datatype in PostgreSQL. Fixes #7518.

    *Yves Senn*
694

695 696 697
*   Fix eagerly loading associations without primary keys. Fixes #4976.

    *Kelley Reynolds*
698

699 700 701 702 703 704
*   Rails now raise an exception when you're trying to run a migration that has an invalid
    file name. Only lower case letters, numbers, and '_' are allowed in migration's file name.
    Please see #7419 for more details.

    *Jan Bernacki*

M
Matt Jones 已提交
705
*   Fix bug when calling `store_accessor` multiple times.
706 707 708 709 710 711 712 713 714
    Fixes #7532.

    *Matt Jones*

*   Fix store attributes that show the changes incorrectly.
    Fixes #7532.

    *Matt Jones*

715 716 717 718
*   Fix `ActiveRecord::Relation#pluck` when columns or tables are reserved words.

    *Ian Lesperance*

719
*   Allow JSON columns to be created in PostgreSQL and properly encoded/decoded.
720 721 722 723
    to/from database.

    *Dickson S. Guedes*

724
*   Fix time column type casting for invalid time string values to correctly return `nil`.
725 726 727

    *Adam Meehan*

728
*   Allow to pass Symbol or Proc into `:limit` option of #accepts_nested_attributes_for.
M
Mikhail Dieterle 已提交
729 730 731

    *Mikhail Dieterle*

732
*   ActiveRecord::SessionStore has been extracted from Active Record as `activerecord-session_store`
733 734 735
    gem. Please read the `README.md` file on the gem for the usage.

    *Prem Sichanugrist*
736

737 738 739 740 741 742
*   Fix `reset_counters` when there are multiple `belongs_to` association with the
    same foreign key and one of them have a counter cache.
    Fixes #5200.

    *Dave Desrochers*

743 744 745 746
*   `serialized_attributes` and `_attr_readonly` become class method only. Instance reader methods are deprecated.

    *kennyj*

747 748 749 750 751
*   Round usec when comparing timestamp attributes in the dirty tracking.
    Fixes #6975.

    *kennyj*

752
*   Use inversed parent for first and last child of `has_many` association.
753 754 755

    *Ravil Bayramgalin*

756
*   Fix `Column.microseconds` and `Column.fast_string_to_time` to avoid converting
757 758 759 760 761
    timestamp seconds to a float, since it occasionally results in inaccuracies
    with microsecond-precision times. Fixes #7352.

    *Ari Pollak*

762 763 764
*   Fix AR#dup to nullify the validation errors in the dup'ed object. Previously the original
    and the dup'ed object shared the same errors.

765
    *Christian Seiler*
766

767 768 769 770
*   Raise `ArgumentError` if list of attributes to change is empty in `update_all`.

    *Roman Shatsov*

771 772 773 774 775
*   Fix AR#create to return an unsaved record when AR::RecordInvalid is
    raised. Fixes #3217.

    *Dave Yeu*

776 777
*   Fixed table name prefix that is generated in engines for namespaced models.

778 779
    *Wojciech Wnętrzak*

780
*   Make sure `:environment` task is executed before `db:schema:load` or `db:structure:load`.
R
Rafael Mendonça França 已提交
781 782 783 784
    Fixes #4772.

    *Seamus Abshere*

785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804
*   Allow Relation#merge to take a proc.

    This was requested by DHH to allow creating of one's own custom
    association macros.

    For example:

        module Commentable
          def has_many_comments(extra)
            has_many :comments, -> { where(:foo).merge(extra) }
          end
        end

        class Post < ActiveRecord::Base
          extend Commentable
          has_many_comments -> { where(:bar) }
        end

    *Jon Leighton*

805
*   Add CollectionProxy#scope.
J
Jon Leighton 已提交
806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822

    This can be used to get a Relation from an association.

    Previously we had a #scoped method, but we're deprecating that for
    AR::Base, so it doesn't make sense to have it here.

    This was requested by DHH, to facilitate code like this:

        Project.scope.order('created_at DESC').page(current_page).tagged_with(@tag).limit(5).scoping do
          @topics      = @project.topics.scope
          @todolists   = @project.todolists.scope
          @attachments = @project.attachments.scope
          @documents   = @project.documents.scope
        end

    *Jon Leighton*

823
*   Add `Relation#load`.
J
Jon Leighton 已提交
824 825 826 827 828 829 830 831 832 833 834 835 836 837

    This method explicitly loads the records and then returns `self`.

    Rather than deciding between "do I want an array or a relation?",
    most people are actually asking themselves "do I want to eager load
    or lazy load?" Therefore, this method provides a way to explicitly
    eager-load without having to switch from a `Relation` to an array.

    Example:

        @posts = Post.where(published: true).load

    *Jon Leighton*

838 839 840 841 842 843 844 845 846
*   `Relation#order`: make new order prepend old one.

        User.order("name asc").order("created_at desc")
        # SELECT * FROM users ORDER BY created_at desc, name asc

    This also affects order defined in `default_scope` or any kind of associations.

    *Bogdan Gusiev*

847
*   `Model.all` now returns an `ActiveRecord::Relation`, rather than an
848
    array of records. Use `Relation#to_a` if you really want an array.
849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864

    In some specific cases, this may cause breakage when upgrading.
    However in most cases the `ActiveRecord::Relation` will just act as a
    lazy-loaded array and there will be no problems.

    Note that calling `Model.all` with options (e.g.
    `Model.all(conditions: '...')` was already deprecated, but it will
    still return an array in order to make the transition easier.

    `Model.scoped` is deprecated in favour of `Model.all`.

    `Relation#all` still returns an array, but is deprecated (since it
    would serve no purpose if we made it return a `Relation`).

    *Jon Leighton*

865 866 867 868 869 870 871
*   `:finder_sql` and `:counter_sql` options on collection associations
    are deprecated. Please transition to using scopes.

    *Jon Leighton*

*   `:insert_sql` and `:delete_sql` options on `has_and_belongs_to_many`
    associations are deprecated. Please transition to using `has_many
872
    :through`.
873 874 875

    *Jon Leighton*

876 877 878 879 880 881 882 883 884 885 886
*   Added `#update_columns` method which updates the attributes from
    the passed-in hash without calling save, hence skipping validations and
    callbacks. `ActiveRecordError` will be raised when called on new objects
    or when at least one of the attributes is marked as read only.

        post.attributes # => {"id"=>2, "title"=>"My title", "body"=>"My content", "author"=>"Peter"}
        post.update_columns(title: 'New title', author: 'Sebastian') # => true
        post.attributes # => {"id"=>2, "title"=>"New title", "body"=>"My content", "author"=>"Sebastian"}

    *Sebastian Martinez + Rafael Mendonça França*

887 888 889
*   The migration generator now creates a join table with (commented) indexes every time
    the migration name contains the word `join_table`:

890
        rails g migration create_join_table_for_artists_and_musics artist_id:index music_id
891 892 893

    *Aleksey Magusev*

894 895
*   Add `add_reference` and `remove_reference` schema statements. Aliases, `add_belongs_to`
    and `remove_belongs_to` are acceptable. References are reversible.
896

897
    Examples:
898 899 900

        # Create a user_id column
        add_reference(:products, :user)
901
        # Create a supplier_id, supplier_type columns and appropriate index
902 903 904 905 906 907
        add_reference(:products, :supplier, polymorphic: true, index: true)
        # Remove polymorphic reference
        remove_reference(:products, :supplier, polymorphic: true)

    *Aleksey Magusev*

908 909 910 911 912 913 914
*   Add `:default` and `:null` options to `column_exists?`.

        column_exists?(:testings, :taggable_id, :integer, null: false)
        column_exists?(:testings, :taggable_type, :string, default: 'Photo')

    *Aleksey Magusev*

915 916
*   `ActiveRecord::Relation#inspect` now makes it clear that you are
    dealing with a `Relation` object rather than an array:.
917

918
        User.where(age: 30).inspect
919
        # => <ActiveRecord::Relation [#<User ...>, #<User ...>, ...]>
B
Brian Cardarella 已提交
920

921
        User.where(age: 30).to_a.inspect
922
        # => [#<User ...>, #<User ...>]
923

924 925 926
    The number of records displayed will be limited to 10.

    *Brian Cardarella, Jon Leighton & Damien Mathieu*
B
Brian Cardarella 已提交
927

928
*   Add `collation` and `ctype` support to PostgreSQL. These are available for PostgreSQL 8.4 or later.
929 930
    Example:

931 932 933 934 935 936 937 938 939
        development:
          adapter: postgresql
          host: localhost
          database: rails_development
          username: foo
          password: bar
          encoding: UTF8
          collation: ja_JP.UTF8
          ctype: ja_JP.UTF8
940 941 942

    *kennyj*

943
*   Changed `validates_presence_of` on an association so that children objects
944 945 946 947 948 949
    do not validate as being present if they are marked for destruction. This
    prevents you from saving the parent successfully and thus putting the parent
    in an invalid state.

    *Nick Monje & Brent Wheeldon*

E
Egor Lynko 已提交
950 951 952 953
*   `FinderMethods#exists?` now returns `false` with the `false` argument.

    *Egor Lynko*

954 955 956 957 958 959
*   Added support for specifying the precision of a timestamp in the postgresql
    adapter. So, instead of having to incorrectly specify the precision using the
    `:limit` option, you may use `:precision`, as intended. For example, in a migration:

        def change
          create_table :foobars do |t|
960
            t.timestamps precision: 0
961 962 963 964 965
          end
        end

    *Tony Schneider*

966
*   Allow `ActiveRecord::Relation#pluck` to accept multiple columns. Returns an
967
    array of arrays containing the typecasted values:
968 969 970 971 972 973 974

        Person.pluck(:id, :name)
        # SELECT people.id, people.name FROM people
        # [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]

    *Jeroen van Ingen & Carlos Antonio da Silva*

975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006
*   Improve the derivation of HABTM join table name to take account of nesting.
    It now takes the table names of the two models, sorts them lexically and
    then joins them, stripping any common prefix from the second table name.

    Some examples:

        Top level models (Category <=> Product)
        Old: categories_products
        New: categories_products

        Top level models with a global table_name_prefix (Category <=> Product)
        Old: site_categories_products
        New: site_categories_products

        Nested models in a module without a table_name_prefix method (Admin::Category <=> Admin::Product)
        Old: categories_products
        New: categories_products

        Nested models in a module with a table_name_prefix method (Admin::Category <=> Admin::Product)
        Old: categories_products
        New: admin_categories_products

        Nested models in a parent model (Catalog::Category <=> Catalog::Product)
        Old: categories_products
        New: catalog_categories_products

        Nested models in different parent models (Catalog::Category <=> Content::Page)
        Old: categories_pages
        New: catalog_categories_content_pages

    *Andrew White*

1007
*   Move HABTM validity checks to `ActiveRecord::Reflection`. One side effect of
1008 1009 1010 1011 1012 1013
    this is to move when the exceptions are raised from the point of declaration
    to when the association is built. This is consistant with other association
    validity checks.

    *Andrew White*

1014
*   Added `stored_attributes` hash which contains the attributes stored using
1015
    `ActiveRecord::Store`. This allows you to retrieve the list of attributes
1016
    you've defined.
1017

1018 1019 1020 1021 1022 1023 1024
       class User < ActiveRecord::Base
         store :settings, accessors: [:color, :homepage]
       end

       User.stored_attributes[:settings] # [:color, :homepage]

    *Joost Baaij & Carlos Antonio da Silva*
1025

1026 1027 1028 1029 1030 1031
*   PostgreSQL default log level is now 'warning', to bypass the noisy notice
    messages. You can change the log level using the `min_messages` option
    available in your config/database.yml.

    *kennyj*

1032 1033 1034
*   Add uuid datatype support to PostgreSQL adapter.

    *Konstantin Shabanov*
1035

1036
*   Added `ActiveRecord::Migration.check_pending!` that raises an error if
1037 1038 1039
    migrations are pending.

    *Richard Schneeman*
1040

1041 1042 1043 1044 1045
*   Added `#destroy!` which acts like `#destroy` but will raise an
    `ActiveRecord::RecordNotDestroyed` exception instead of returning `false`.

    *Marc-André Lafortune*

1046 1047 1048 1049 1050 1051 1052 1053 1054
*   Added support to `CollectionAssociation#delete` for passing `fixnum`
    or `string` values as record ids. This finds the records responding
    to the `id` and executes delete on them.

        class Person < ActiveRecord::Base
          has_many :pets
        end

        person.pets.delete("1") # => [#<Pet id: 1>]
1055
        person.pets.delete(2, 3) # => [#<Pet id: 2>, #<Pet id: 3>]
1056 1057 1058

    *Francesco Rodriguez*

1059 1060 1061 1062 1063 1064 1065 1066 1067 1068
*   Deprecated most of the 'dynamic finder' methods. All dynamic methods
    except for `find_by_...` and `find_by_...!` are deprecated. Here's
    how you can rewrite the code:

      * `find_all_by_...` can be rewritten using `where(...)`
      * `find_last_by_...` can be rewritten using `where(...).last`
      * `scoped_by_...` can be rewritten using `where(...)`
      * `find_or_initialize_by_...` can be rewritten using
        `where(...).first_or_initialize`
      * `find_or_create_by_...` can be rewritten using
1069
        `find_or_create_by(...)` or where(...).first_or_create`
1070
      * `find_or_create_by_...!` can be rewritten using
1071
        `find_or_create_by!(...) or `where(...).first_or_create!`
1072 1073

    The implementation of the deprecated dynamic finders has been moved
1074
    to the `activerecord-deprecated_finders` gem. See below for details.
1075 1076 1077 1078 1079 1080 1081

    *Jon Leighton*

*   Deprecated the old-style hash based finder API. This means that
    methods which previously accepted "finder options" no longer do. For
    example this:

1082
        Post.find(:all, conditions: { comments_count: 10 }, limit: 5)
1083 1084 1085 1086 1087 1088 1089

    Should be rewritten in the new style which has existed since Rails 3:

        Post.where(comments_count: 10).limit(5)

    Note that as an interim step, it is possible to rewrite the above as:

1090
        Post.all.merge(where: { comments_count: 10 }, limit: 5)
1091 1092 1093 1094

    This could save you a lot of work if there is a lot of old-style
    finder usage in your application.

1095
    `Relation#merge` now accepts a hash of
1096 1097 1098 1099
    options, but they must be identical to the names of the equivalent
    finder method. These are mostly identical to the old-style finder
    option names, except in the following cases:

1100 1101
      * `:conditions` becomes `:where`.
      * `:include` becomes `:includes`.
1102 1103

    The code to implement the deprecated features has been moved out to
1104
    the `activerecord-deprecated_finders` gem. This gem is a dependency
1105 1106 1107 1108 1109 1110 1111
    of Active Record in Rails 4.0. It will no longer be a dependency
    from Rails 4.1, but if your app relies on the deprecated features
    then you can add it to your own Gemfile. It will be maintained by
    the Rails core team until Rails 5.0 is released.

    *Jon Leighton*

J
Johannes Barre 已提交
1112 1113 1114 1115
*   It's not possible anymore to destroy a model marked as read only.

    *Johannes Barre*

1116
*   Added ability to ActiveRecord::Relation#from to accept other ActiveRecord::Relation objects.
1117 1118 1119 1120 1121 1122

      Record.from(subquery)
      Record.from(subquery, :a)

    *Radoslav Stankov*

1123 1124 1125 1126 1127 1128
*   Added custom coders support for ActiveRecord::Store. Now you can set
    your custom coder like this:

        store :settings, accessors: [ :color, :homepage ], coder: JSON

    *Andrey Voronkov*
1129

1130 1131 1132 1133 1134 1135
*   `mysql` and `mysql2` connections will set `SQL_MODE=STRICT_ALL_TABLES` by
    default to avoid silent data loss. This can be disabled by specifying
    `strict: false` in your `database.yml`.

    *Michael Pearson*

1136
*   Added default order to `first` to assure consistent results among
1137
    different database engines. Introduced `take` as a replacement to
1138 1139 1140 1141
    the old behavior of `first`.

    *Marcelo Silveira*

1142
*   Added an `:index` option to automatically create indexes for references
1143 1144 1145 1146 1147 1148 1149
    and belongs_to statements in migrations.

    The `references` and `belongs_to` methods now support an `index`
    option that receives either a boolean value or an options hash
    that is identical to options available to the add_index method:

      create_table :messages do |t|
1150
        t.references :person, index: true
1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161
      end

      Is the same as:

      create_table :messages do |t|
        t.references :person
      end
      add_index :messages, :person_id

    Generators have also been updated to use the new syntax.

1162
    *Joshua Wood*
1163

1164 1165 1166 1167 1168 1169 1170
*   Added bang methods for mutating `ActiveRecord::Relation` objects.
    For example, while `foo.where(:bar)` will return a new object
    leaving `foo` unchanged, `foo.where!(:bar)` will mutate the foo
    object

    *Jon Leighton*

1171 1172 1173 1174 1175 1176 1177 1178 1179 1180
*   Added `#find_by` and `#find_by!` to mirror the functionality
    provided by dynamic finders in a way that allows dynamic input more
    easily:

        Post.find_by name: 'Spartacus', rating: 4
        Post.find_by "published_at < ?", 2.weeks.ago
        Post.find_by! name: 'Spartacus'

    *Jon Leighton*

G
Guillermo Iguaran 已提交
1181 1182 1183 1184 1185
*   Added ActiveRecord::Base#slice to return a hash of the given methods with
    their names as keys and returned values as values.

    *Guillermo Iguaran*

J
Jon Leighton 已提交
1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216
*   Deprecate eager-evaluated scopes.

    Don't use this:

        scope :red, where(color: 'red')
        default_scope where(color: 'red')

    Use this:

        scope :red, -> { where(color: 'red') }
        default_scope { where(color: 'red') }

    The former has numerous issues. It is a common newbie gotcha to do
    the following:

        scope :recent, where(published_at: Time.now - 2.weeks)

    Or a more subtle variant:

        scope :recent, -> { where(published_at: Time.now - 2.weeks) }
        scope :recent_red, recent.where(color: 'red')

    Eager scopes are also very complex to implement within Active
    Record, and there are still bugs. For example, the following does
    not do what you expect:

        scope :remove_conditions, except(:where)
        where(...).remove_conditions # => still has conditions

    *Jon Leighton*

1217 1218 1219 1220 1221 1222 1223 1224 1225 1226
*   Remove IdentityMap

    IdentityMap has never graduated to be an "enabled-by-default" feature, due
    to some inconsistencies with associations, as described in this commit:

       https://github.com/rails/rails/commit/302c912bf6bcd0fa200d964ec2dc4a44abe328a6

    Hence the removal from the codebase, until such issues are fixed.

    *Carlos Antonio da Silva*
C
Carlos Antonio da Silva 已提交
1227

1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238
*   Added the schema cache dump feature.

    `Schema cache dump` feature was implemetend. This feature can dump/load internal state of `SchemaCache` instance
    because we want to boot rails more quickly when we have many models.

    Usage notes:

      1) execute rake task.
      RAILS_ENV=production bundle exec rake db:schema:cache:dump
      => generate db/schema_cache.dump

1239
      2) add config.active_record.use_schema_cache_dump = true in config/production.rb. BTW, true is default.
1240 1241 1242

      3) boot rails.
      RAILS_ENV=production bundle exec rails server
1243
      => use db/schema_cache.dump
1244 1245 1246 1247 1248 1249 1250

      4) If you remove clear dumped cache, execute rake task.
      RAILS_ENV=production bundle exec rake db:schema:cache:clear
      => remove db/schema_cache.dump

    *kennyj*

1251
*   Added support for partial indices to PostgreSQL adapter.
1252 1253 1254 1255

    The `add_index` method now supports a `where` option that receives a
    string with the partial index criteria.

1256
        add_index(:accounts, :code, where: 'active')
1257

1258
        Generates
1259

1260
        CREATE INDEX index_accounts_on_code ON accounts(code) WHERE active
1261 1262 1263

    *Marcelo Silveira*

1264
*   Implemented ActiveRecord::Relation#none method.
1265 1266 1267 1268 1269 1270 1271 1272 1273 1274

    The `none` method returns a chainable relation with zero records
    (an instance of the NullRelation class).

    Any subsequent condition chained to the returned relation will continue
    generating an empty relation and will not fire any query to the database.

    *Juanjo Bazán*

*   Added the `ActiveRecord::NullRelation` class implementing the null
1275
    object pattern for the Relation class.
1276

1277 1278 1279
    *Juanjo Bazán*

*   Added new `dependent: :restrict_with_error` option. This will add
1280
    an error to the model, rather than raising an exception.
1281

1282 1283
    The `:restrict` option is renamed to `:restrict_with_exception` to
    make this distinction explicit.
1284

1285
    *Manoj Kumar & Jon Leighton*
1286

1287
*   Added `create_join_table` migration helper to create HABTM join tables.
1288 1289 1290

        create_join_table :products, :categories
        # =>
1291 1292 1293
        # create_table :categories_products, id: false do |td|
        #   td.integer :product_id,  null: false
        #   td.integer :category_id, null: false
1294 1295 1296 1297
        # end

    *Rafael Mendonça França*

1298
*   The primary key is always initialized in the @attributes hash to `nil` (unless
1299
    another value has been specified).
1300

1301 1302
    *Aaron Paterson*

1303 1304 1305 1306 1307 1308 1309 1310 1311 1312
*   In previous releases, the following would generate a single query with
    an `OUTER JOIN comments`, rather than two separate queries:

        Post.includes(:comments)
            .where("comments.name = 'foo'")

    This behaviour relies on matching SQL string, which is an inherently
    flawed idea unless we write an SQL parser, which we do not wish to
    do.

1313 1314 1315 1316
    Therefore, it is now deprecated.

    To avoid deprecation warnings and for future compatibility, you must
    explicitly state which tables you reference, when using SQL snippets:
1317 1318 1319 1320 1321 1322 1323 1324

        Post.includes(:comments)
            .where("comments.name = 'foo'")
            .references(:comments)

    Note that you do not need to explicitly specify references in the
    following cases, as they can be automatically inferred:

1325 1326 1327
        Post.includes(:comments).where(comments: { name: 'foo' })
        Post.includes(:comments).where('comments.name' => 'foo')
        Post.includes(:comments).order('comments.name')
1328

1329
    You do not need to worry about this unless you are doing eager
1330 1331 1332
    loading. Basically, don't worry unless you see a deprecation warning
    or (in future releases) an SQL error due to a missing JOIN.

1333
    *Jon Leighton*
1334

1335
*   Support for the `schema_info` table has been dropped. Please
1336 1337
    switch to `schema_migrations`.

1338 1339 1340
    *Aaron Patterson*

*   Connections *must* be closed at the end of a thread. If not, your
1341 1342
    connection pool can fill and an exception will be raised.

1343 1344
    *Aaron Patterson*

1345 1346
*   PostgreSQL hstore records can be created.

1347 1348
    *Aaron Patterson*

1349 1350
*   PostgreSQL hstore types are automatically deserialized from the database.

1351 1352
    *Aaron Patterson*

X
Xavier Noria 已提交
1353
Please check [3-2-stable](https://github.com/rails/rails/blob/3-2-stable/activerecord/CHANGELOG.md) for previous changes.