aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/CHANGELOG.md
Commit message (Collapse)AuthorAgeFilesLines
* Merge pull request #20957 from akihiro17/find-by-issueSean Griffin2015-10-201-0/+6
|\ | | | | | | Fix find_by with association subquery issue
| * Don't cache arguments in #find_by if they are an ActiveRecord::Relationakihiro172015-10-061-0/+6
| | | | | | | | | | | | | | In this commit, find_by doesn't cache arguments so that find_by with association subquery works correctly. Fixes #20817
* | Qualify column names in calculationSoutaro Matsumoto2015-10-201-0/+7
| | | | | | | | Column names inserted via `group` have to be qualified with table name.
* | Do not cache prepared statements that are unlikely to have cache hitsSean Griffin2015-10-201-0/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Prior to this commit, Rails makes no differentiation between whether a query uses bind parameters, and whether or not we cache that query as a prepared statement. This leads to the cache populating extremely fast in some cases, with the statements never being reused. In particular, the two problematic cases are `where(foo: [1, 2, 3])` and `where("foo = ?", 1)`. In both cases we'll end up quoting the values rather than using a bind param, causing a cache entry for every value ever used in that query. It was noted that we can probably eventually change `where("foo = ?", 1)` to use a bind param, which would resolve that case. Additionally, on PG we can change our generated query to be `WHERE foo = ANY($1)`, and pass an array for the bind param. I hope to accomplish both in the future. For SQLite and MySQL, we still end up preparing the statements anyway, we just don't cache it. The statement will be cleaned up after it is executed. On postgres, we skip the prepare step entirely, as an API is provided to execute with bind params without preparing the statement. I'm not 100% happy on the way this ended up being structured. I was hoping to use a decorator on the visitor, rather than mixing a module into the object, but the way Arel has it's visitor pattern set up makes it very difficult to extend without inheritance. I'd like to remove the duplication from the various places that are extending it, but that'll require a larger restructuring of that initialization logic. I'm going to take another look at the structure of it soon. This changes the signature of one of the adapter's internals, and will require downstream changes from third party adapters. I'm not too worried about this, as worst case they can simply add the parameter and always ignore it, and just keep their previous behavior. Fixes #21992.
* | Add CHANGELOG entry for fix of #21955 [ci skip]Rafael Mendonça França2015-10-201-0/+6
| |
* | `where` raises ArgumentError on unsupported types.Jake Worth2015-10-161-0/+6
| | | | | | | | [#20473]
* | Add an immutable string type to opt out of string dupingSean Griffin2015-10-151-0/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This type adds an escape hatch to apps for which string duping causes unacceptable memory growth. The reason we are duping them is in order to detect mutation, which was a feature added to 4.2 in #15674. The string type was modified to support this behavior in #15788. Memory growth is really only a concern for string types, as it's the only mutable type where the act of coersion does not create a new object regardless (as we're usually returning an object of a different class). I do feel strongly that if we are going to support detecting mutation, we should do it universally for any type which is mutable. While it is less common and ideomatic to mutate strings than arrays or hashes, there shouldn't be rules or gotchas to understanding our behavior. However, I also appreciate that for apps which are using a lot of string columns, this would increase the number of allocations by a large factor. To ensure that we keep our contract, if you'd like to opt out of mutation detection on strings, you'll also be option out of mutation of those strings. I'm not completely married to the thought that strings coming out of this actually need to be frozen -- and I think the name is correct either way, as the purpose of this is to provide a string type which does not detect mutation. In the new implementation, I'm only overriding `cast_value`. I did not port over the duping in `serialize`. I cannot think of a reason we'd need to dup the string there, and the tests pass without it. Unfortunately that line was introduced at a time where I was not nearly as good about writing my commit messages, so I have no context as to why I added it. Thanks past Sean. You are a jerk.
* | Add deprecation warning to `ActiveRecord::Relation#update`Ted Johansson2015-10-151-0/+7
| | | | | | | | | | | | | | | | When passing an instance of `ActiveRecord::Base` to `#update`, it would internally call `#find`, resulting in a misleading deprecation warning. This change gives this deprecated use of `#update` its own, meaningful warning.
* | `:to_table` when adding a fk through `add_reference`.Yves Senn2015-10-131-0/+7
| | | | | | | | | | | | | | | | | | | | | | | | Closes #21563. The `name` argument of `add_references` was both used to generate the column name `<name>_id` and as the target table for the foreign key `name.pluralize`. It's primary purpose is to define the column name. In cases where the `to_table` of the foreign key is different than the column name we should be able to specify it individually.
* | Merge pull request #21931 from paul/bugfix/remove-deprecated-pg_dump-flagYves Senn2015-10-121-0/+4
| | | | | | | | Remove deprecated pg_dump -i flag
* | Merge pull request #11410 from bogdan/increment-concurencyJeremy Daer2015-10-101-0/+5
|\ \ | | | | | | | | | Make AR#increment! and #decrement! concurrency-safe
| * | Make #increment! and #decrement! methods concurency safeBogdan Gusiev2015-10-051-0/+4
| | |
* | | Avoid leaking the first relation we call #first onMatthew Draper2015-10-091-0/+6
| | | | | | | | | | | | | | | | | | | | | | | | With the previous implementation, the block passed to define_singleton_method, which will live forever as the method body, captures the parameters (args and block) in its enclosure. For the current_scope registry, that can include an AR::Relation.
* | | Remove unused `pk_and_sequence_for` in AbstractMysqlAdapterRyuta Kamizono2015-10-081-0/+4
| |/ |/| | | | | | | | | `pk_and_sequence_for` is implemented for PG and MySQL adapters (not implemented for Sqlite3 adapter). But MySQL adapters are not using `pk_and_sequence_for` already.
* | Refactor AS::Callbacks halt config and fix the documentationRoque Pinel2015-10-011-1/+1
| | | | | | | | | | | | | | | | | | Move from `AS::Callbacks::CallbackChain.halt_and_display_warning_on_return_false` to `AS::Callbacks.halt_and_display_warning_on_return_false` base on [this discussion](https://github.com/rails/rails/pull/21218#discussion_r39354580) Fix the documentation broken by 0a120a818d413c64ff9867125f0b03788fc306f8
* | Merge pull request #20574 from repinel/fix-db-fixtures-loadYves Senn2015-09-301-0/+13
|\ \ | |/ |/| | | | | | | | | Allow fixtures YAML files to set the model class in the file itself Conflicts: activerecord/CHANGELOG.md
| * Allow fixtures YAML files to set the model class in the file itselfRoque Pinel2015-09-111-0/+15
| | | | | | | | | | | | | | | | Currently, `set_fixture_class` is only available using the `TestFixtures` concern and it is ignored for `rake db:fixtures:load`. Using the correct model class, it is possible for the fixture load to also load the associations from the YAML files (e.g., `:belongs_to` and `:has_many`).
* | `validates_acceptance_of` shouldn't require a database connectionSean Griffin2015-09-251-0/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | The implementation of `attribute_method?` on Active Record requires establishing a database connection and querying the schema. As a general rule, we don't want to require database connections for any class macro, as the class should be able to be loaded without a database (e.g. for things like compiling assets). Instead of eagerly defining these methods, we do it lazily the first time they are accessed via `method_missing`. This should not cause any performance hits, as it will only hit `method_missing` once for the entire class.
* | Implement ActiveRecord::Base.ignored_columnsJean Boussier2015-09-241-0/+5
| |
* | Merge pull request #21550 from didacte/unscope-associationsSean Griffin2015-09-241-0/+4
|\| | | | | | | ActiveRecord: use association's `unscope` when preloading
* | Merge pull request #20317Sean Griffin2015-09-231-0/+20
|\ \ | | | | | | | | | | | | AR: take precision into count when assigning a value to timestamp attribute
| * | Fixed taking precision into count when assigning a value to timestamp attributeBogdan Gusiev2015-09-231-0/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Timestamp column can have less precision than ruby timestamp In result in how big a fraction of a second can be stored in the database. m = Model.create! m.created_at.usec == m.reload.created_at.usec # => false # due to different seconds precision in Time.now and database column If the precision is low enough, (mysql default is 0, so it is always low enough by default) the value changes when model is reloaded from the database. This patch fixes that issue ensuring that any timestamp assigned as an attribute is converted to column precision under the attribute.
* | | introduce `conn.data_source_exists?` and `conn.data_sources`.Yves Senn2015-09-221-0/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | These new methods are used from the Active Record model layer to determine which relations are viable to back a model. These new methods allow us to change `conn.tables` in the future to only return tables and no views. Same for `conn.table_exists?`. The goal is to provide the following introspection methods on the connection: * `tables` * `table_exists?` * `views` * `view_exists?` * `data_sources` (views + tables) * `data_source_exists?` (views + tables)
* | | Merge pull request #20569 from theSteveMitchell/masterYves Senn2015-09-221-0/+5
|\ \ \ | |/ / |/| / | |/ Check mysql structure_load for errors
* | Ensure aliased attributes passed to `select` are quoted if using `from`Sean Griffin2015-09-211-0/+6
| | | | | | | | | | | | Fixes #21488 [Sean Griffin & johanlunds]
* | Merge pull request #17696 from kamipo/unsigned_integer_supportJeremy Daer2015-09-191-0/+19
|\ \ | | | | | | | | | Add `unsigned` support for numeric data types in MySQL
| * | Add `unsigned` types for numeric data types in MySQLRyuta Kamizono2015-09-181-0/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In the case of using `unsigned` as the type: create_table :foos do |t| t.unsigned_integer :unsigned_integer t.unsigned_bigint :unsigned_bigint t.unsigned_float :unsigned_float t.unsigned_decimal :unsigned_decimal, precision: 10, scale: 2 end
| * | Add `unsigned` support for numeric data types in MySQLRyuta Kamizono2015-09-181-0/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Example: create_table :foos do |t| t.integer :unsigned_integer, unsigned: true t.bigint :unsigned_bigint, unsigned: true t.float :unsigned_float, unsigned: true t.decimal :unsigned_decimal, unsigned: true, precision: 10, scale: 2 end
* | | Merge pull request #21609 from kamipo/do_not_dump_view_as_tableJeremy Daer2015-09-191-0/+4
|\ \ \ | | | | | | | | | | | | Do not dump a view as a table in sqlite3, mysql and mysql2 adapters
| * | | Add `#views` and `#view_exists?` methods on connection adaptersRyuta Kamizono2015-09-131-0/+4
| | |/ | |/|
* | | Correctly dump composite primary keyRyuta Kamizono2015-09-201-0/+11
| |/ |/| | | | | | | | | | | | | | | Example: create_table :barcodes, primary_key: ["region", "code"] do |t| t.string :region t.integer :code end
* | Merge pull request #21581 from ronakjangir47/restrict_with_errorYves Senn2015-09-171-0/+5
|/ | | | `restrict_with_error` message will now respect owner’s human name
* Correct query for PostgreSQL 8.2Matthew Draper2015-09-081-0/+4
| | | | Generic cast-to-text was only added in 8.3.
* Merge pull request #21527 from rngtng/fix-migrator-path-setupYves Senn2015-09-071-0/+6
|\ | | | | | | Use global migrations_path configuration in Migrator
| * Allow global migrations_path configuration with using value from ↵Tobias Bielohlawek2015-09-071-0/+11
|/ | | | database_tasks instead of Migrator
* changelog, minor formatting changes.Yves Senn2015-09-071-9/+9
|
* Merge pull request #21317 from ↵Matthew Draper2015-09-071-0/+7
|\ | | | | | | | | | | greysteil/support-postgres-drop-index-concurrently Support dropping indexes concurrently in Postgres
| * Support dropping indexes concurrently in PostgresGrey Baker2015-09-051-0/+7
| | | | | | | | | | See http://www.postgresql.org/docs/9.4/static/sql-dropindex.html for more details.
* | Deprecate passing conditions to AR::Relation destroy_all and delete_all methodsWojciech Wnętrzak2015-09-061-0/+5
|/
* pg, `create_schema`, `drop_schema` and `rename_table` quote schema name.Yves Senn2015-08-281-0/+12
| | | | | | | | Closes #21418. Previously schema names were not quoted. This leads to issues when a schema names contains a ".". Methods in `schema_statements.rb` should quote user input.
* PostgreSQL, add `:if_exists` to `#drop_schema`.Yves Senn2015-08-281-0/+6
|
* Only nullify persisted has_one target associationsAgis-2015-08-241-0/+6
| | | | | | | | | | | | | | | | | | | | | | | | | Since after 87d1aba3c `dependent: :destroy` callbacks on has_one assocations run *after* destroy, it is possible that a nullification is attempted on an already destroyed target: class Car < ActiveRecord::Base has_one :engine, dependent: :nullify end class Engine < ActiveRecord::Base belongs_to :car, dependent: :destroy end > car = Car.create! > engine = Engine.create!(car: car) > engine.destroy! # => ActiveRecord::ActiveRecordError: cannot update a > destroyed record In the above case, `engine.destroy!` deletes `engine` and *then* triggers the deletion of `car`, which in turn triggers a nullification of `engine.car_id`. However, `engine` is already destroyed at that point. Fixes #21223.
* uniqueness validation raises error for persisted record without pk.Yves Senn2015-08-201-0/+7
| | | | | | | | Closes #21304. While we can validate uniqueness for record without primary key on creation, there is no way to exclude the current record when updating. (The update itself will need a primary key to work correctly).
* Add a native JSON data type support in MySQLRyuta Kamizono2015-08-181-0/+10
| | | | | | | | | | As of MySQL 5.7.8, MySQL supports a native JSON data type. Example: create_table :json_data_type do |t| t.json :settings end
* descriptive error message when fixtures contian a missing column.Yves Senn2015-08-131-0/+6
| | | | Closes #21201.
* Merge pull request #17885 from starbelly/patch-1Yves Senn2015-08-111-0/+5
|\ | | | | | | | | | | | | Add method to run command-line db apps Conflicts: activerecord/CHANGELOG.md
| * Add run_cmd class method to ActiveRecord::Tasks::DatabaseTasksstarbelly2015-08-011-0/+8
| | | | | | | | | | | | | | | | | | | | - Added run_cmd() class method to dry up Kernel.system() messages within this namespace and avoid shell expansion by passing a list of arguments instead of a string - Update structure_dump, structure_load, and related tests units to pass a list of params instead of using a string to avoid shell expansion
* | Remove XML Serialization from core.Zachary Scott2015-08-071-0/+4
| | | | | | | | | | | | | | This includes the following classes: - ActiveModel::Serializers::Xml - ActiveRecord::Serialization::XmlSerializer
* | Add ActiveRecord::Relation#in_batchesSina Siadat2015-08-071-0/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `in_batches` yields Relation objects if a block is given, otherwise it returns an instance of `BatchEnumerator`. The existing `find_each` and `find_in_batches` methods work with batches of records. The new API allows working with relation batches as well. Examples: Person.in_batches.each_record(&:party_all_night!) Person.in_batches.update_all(awesome: true) Person.in_batches.delete_all Person.in_batches.map do |relation| relation.delete_all sleep 10 # Throttles the delete queries end
* | Merge pull request #20459Sean Griffin2015-08-061-0/+15
|\ \