aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record
Commit message (Collapse)AuthorAgeFilesLines
* Change `PredicateBuilder` handler methods to instance methodsSean Griffin2014-12-265-30/+71
| | | | | | | | | | | | This will allow us to pass the predicate builder into the constructor of these handlers. The procs had to be changed to objects, because the `PredicateBuilder` needs to be marshalable. If we ever decide to make `register_handler` part of the public API, we should come up with a better solution which allows procs. /cc @mrgilman [Sean Griffin & Melanie Gilman]
* Add missing `:nodoc:`Sean Griffin2014-12-261-1/+1
| | | | | We're accidentally documenting `PredicateBuilder` and `ArrayHandler` since there's a constant which is missing `# :nodoc:`
* Inject the `PredicateBuilder` into the `Relation` instanceSean Griffin2014-12-269-16/+24
| | | | | | | Construction of relations can be a hotspot, we don't want to create one of these in the constructor. This also allows us to do more expensive things in the predicate builder's constructor, since it's created once per AR::Base subclass
* Remove unused `@relation` instance variableSean Griffin2014-12-261-2/+0
| | | | We don't memoize the relation instance
* Merge branch 'brainopia-remember_frozen_state_in_transaction'Sean Griffin2014-12-261-7/+5
|\
| * Propagate frozen state during transaction changesbrainopia2014-12-261-7/+5
|/
* Correctly ignore `case_sensitive` for UUID uniqueness validationSean Griffin2014-12-265-2/+14
| | | | | | | | I think we should deprecate this behavior and just error if you tell us to do a case insensitive comparison for types which are not case sensitive. Partially reverts 35592307 Fixes #18195
* Dump the default `nil` for PostgreSQL UUID primary key.Ryuta Kamizono2014-12-261-1/+1
|
* - Changed `target` to `target_reflection` to avoid warning `possible ↵Vipul A M2014-12-251-2/+2
| | | | reference to past scope`
* Check for Rails.env instead of RailsPavel Penkov2014-12-251-1/+1
| | | | | `Rails` constant is added by rails-html-sanitizer leading to bugs in non-Rails apps using ActiveRecord and ActionMailer
* Correct grammar to fix #18182 [ci skip]Zachary Scott2014-12-241-1/+1
|
* Merge pull request #18159 from ↵Sean Griffin2014-12-231-1/+1
|\ | | | | | | | | M7/docs-active_record-update_query_method_docs_with_full_description Describe full behaviour of Active Record's attribute query methods
| * Clarify that query methods have a custom definition of whether a numeric ↵Michael D.W. Prendergast2014-12-231-2/+2
| | | | | | | | | | value is present. [ci skip] The way Active Record query methods handle numeric values is a special case, and is not part of Rails's standard definition of present. This update attempts to make this more clear in the docs, so that people don't expect Object#present? to return false if used on a number that is zero.
| * Clarify that the word present refers to Object#present?. [ci skip]Michael D.W. Prendergast2014-12-231-36/+2
| | | | | | Update Active Record's attribute query methods documentation to clarify that whether an attribute is present is based on Object#present?. This gives people a place to go see what the exact definition of presence is. [ci skip]
| * Update Active Record's attribute query methods documentation to describe its ↵Michael D.W. Prendergast2014-12-221-2/+36
| | | | | | | | full behaviour. [ci skip]
* | Merge pull request #18174 from bogdan/cleanup_has_many_though_association_countSean Griffin2014-12-231-15/+0
|\ \ | | | | | | Remove unneeded special case to calculate size for has_many :through
| * | Remove unneeded special case to calculate size for has_many :throughBogdan Gusiev2014-12-231-15/+0
| |/ | | | | | | | | All cases are properly handled in CollectionAssociation for all subclasses of this association
* | Don't treat `nil` as changed in serialized typesSean Griffin2014-12-231-1/+1
| | | | | | | | | | | | | | We were ignoring the `default_value?` escape clause in the serialized type, which caused the default value to always be treated as changed. Fixes #18169
* | Refactor a common class to reduce the duplication for `references`Sean Griffin2014-12-232-59/+86
| | | | | | | | | | | | | | | | The code for `TableDefinition#references` and `SchemaStatements#add_reference` were almost identical both structurally, and in terms of domain knowledge. This removes that duplication into a common class, using the `Table` API as the expected interface of its collaborator.
* | Fix syntax warningSean Griffin2014-12-231-1/+1
| | | | | | | | This isn't Seattle.rb, @senny. ;)
* | Merge pull request #18167 from al2o3cr/checkin_connection_leakSean Griffin2014-12-231-4/+6
|\ \ | | | | | | Fix connection leak when a thread checks in additional connections.
| * | Fix connection leak when a thread checks in additional connections.Matt Jones2014-12-231-4/+6
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The code in `ConnectionPool#release` assumed that a single thread only ever holds a single connection, and thus that releasing a connection only requires the owning thread_id. There is a trivial counterexample to this assumption: code that checks out additional connections from the pool in the same thread. For instance: connection_1 = ActiveRecord::Base.connection connection_2 = ActiveRecord::Base.connection_pool.checkout ActiveRecord::Base.connection_pool.checkin(connection_2) connection_3 = ActiveRecord::Base.connection At this point, connection_1 has been removed from the `@reserved_connections` hash, causing a NEW connection to be returned as connection_3 and the loss of any tracking info on connection_1. As long as the thread in this example lives, connection_1 will be inaccessible and un-reapable. If this block of code runs more times than the size of the connection pool in a single thread, every subsequent connection attempt will timeout, as all of the available connections have been leaked. Reverts parts of 9e457a8654fa89fe329719f88ae3679aefb21e56 and essentially all of 4367d2f05cbeda855820e25a08353d4b7b3457ac
* | Merge pull request #18145 from georgemillo/patch-2Sean Griffin2014-12-231-0/+3
|\ \ | | | | | | Add information about "allow_destroy" requiring an ID. [ci skip]
| * | Add information about "allow_destroy" requiring an ID. [ci skip]George Millo2014-12-231-0/+3
| | | | | | | | | | | | | | | | | | | | | I just wasted an absurd amount of time trying to figure out why my model wasn't being deleted even though I was setting `_destroy` to true like the instructions said. Making the documentation a little bit clear so that someone like me doesn't waste their time in future.
* | | Merge Pull Request #18157Sean Griffin2014-12-231-1/+5
|\ \ \ | | | | | | | | | | | | | | | | Conflicts: activerecord/CHANGELOG.md
| * | | Don't raise on out-of-range datetimes passed by a userGrey Baker2014-12-231-1/+5
| | |/ | |/|
* | | docs, replace ` with + for proper rdoc output. [ci skip]Yves Senn2014-12-232-4/+4
| | |
* | | Replace deprecated `#load_schema` with `#load_schema_for`.Yves Senn2014-12-232-24/+21
| | |
* | | Fixing numeric attrs when set to same negative valueDaniel Fox2014-12-231-1/+1
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This bug occurs when an attribute of an ActiveRecord model is an ActiveRecord::Type::Integer type or a ActiveRecord::Type::Decimal type (or any other type that includes the ActiveRecord::Type::Numeric module. When the value of the attribute is negative and is set to the same negative value, it is marked as changed. Take the following example of a Person model with the integer attribute age: class Person < ActiveRecord::Base # age :integer(4) end The following will produce the error: person = Person.new(age: -1) person.age = -1 person.changes => { "age" => [-1, -1] } person.age_changed? => true The problematic line is here: module ActiveRecord module Type module Numeric ... def non_numeric_string?(value) # 'wibble'.to_i will give zero, we want to make sure # that we aren't marking int zero to string zero as # changed. value.to_s !~ /\A\d+\.?\d*\z/ end end end end The regex match doesn't accept numbers with a leading '-'.
* | Improve the performance of reading belongs_to associationsSean Griffin2014-12-221-5/+6
| | | | | | | | | | | | | | | | | | | | | | | | `ActiveRecord::Base#[]` has overhead that was introduced in 4.2. The `foo["id"]` working with PKs other than ID isn't really a case that we want to support publicly, but deprecating was painful enough that we avoid it. `_read_attribute` was introduced as the faster alternative for use internally. By using that, we can save a lot of overhead. We also save some overhead by reading the attribute one fewer times in `stale_state`. Fixes #18151
* | Don't perform statement caching for `find` when called from a scopeSean Griffin2014-12-221-0/+1
| | | | | | | | | | | | | | | | If there is a method defined such as `find_and_do_stuff(id)`, which then gets called on an association, we will perform statement caching and the parent ID will not change on subsequent calls. Fixes #18117
* | Don't calculate all in-place changes to determine if attribute_changed?Sean Griffin2014-12-221-0/+4
| | | | | | | | | | | | | | | | | | Calling `changed_attributes` will ultimately check if every mutable attribute has changed in place. Since this gets called whenever an attribute is assigned, it's extremely slow. Instead, we can avoid this calculation until we actually need it. Fixes #18029
* | Add `foreign_key` as an option to `references` for `change_table`Sean Griffin2014-12-222-4/+22
| | | | | | | | | | | | | | | | | | | | | | This has the same comments as 9af90ffa00ba35bdee888e3e1ab775ba0bdbe72c, however it affects the `add_reference` method, and `t.references` in the context of a `change_table` block. There is a lot of duplication of code between creating and updating tables. We should re-evaluate the structure of this code from a high level so changes like this don't need to be made in two places. (Note to self)
* | Convert `add_references` to use kwargsSean Griffin2014-12-221-6/+18
| | | | | | | | | | | | While we still aren't accepting PRs that only make changes like this, it's fine when we're actively working on a method if it makes our lives easier.
* | Add a `foreign_key` option to `references` while creating the tableSean Griffin2014-12-222-5/+34
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Rather than having to do: create_table :posts do |t| t.references :user end add_foreign_key :posts, :users You can instead do: create_table :posts do |t| t.references :user, foreign_key: true end Similar to the `index` option, you can also pass a hash. This will be passed as the options to `add_foreign_key`. e.g.: create_table :posts do |t| t.references :user, foreign_key: { primary_key: :other_id } end is equivalent to create_table :posts do |t| t.references :user end add_foreign_key :posts, :users, primary_key: :other_id
* | Convert `references` to kwargsSean Griffin2014-12-221-7/+17
| | | | | | | | | | | | While we aren't taking PRs with these kinds of changes just yet, they are fine if we're actively working on the method and it makes things easier.
* | Correctly handle limit on int4 and int8 types in PGSean Griffin2014-12-221-2/+2
|/ | | | | | | | | | | | | | | | PG doesn't register it's types using the `int(4)` format that others do. As such, if we alias `int8` to the other integer types, the range information is lost. This is fixed by simply registering it separately. The other option (which I specifically chose to avoid) is to pass the information of the original type that was being aliased as an argument. I'd rather avoid that, since an alias should truly be treated the same. If we need different behavior for a different type, we should explicitly register it with that, and not have a conditional based on aliasing. Fixes #18144 [Sean Griffin & ysbaddaden]
* Correctly handle Float -> BigDecimal with unspecified precisionSean Griffin2014-12-221-1/+9
| | | | Fixes #18122
* Fixed syntax error in RDoc directiveZachary Scott2014-12-201-1/+1
|
* Merge pull request #18092 from nippysaurus/clarity_batch_starting_pointArthur Nogueira Neves2014-12-201-2/+2
|\ | | | | Update description for `start` parameter.
| * Clarity start parameterMichael Dawson2014-12-191-2/+2
| | | | | | | | | | | | I find that `Specifies the starting point for the batch processing.` does not give enough information for me to understand what this parameter actually does.
* | Merge pull request #18102 from arthurnn/nodoc_constantArthur Nogueira Neves2014-12-191-0/+2
| | | | | | | | Add nodoc to some constants [skip ci]
* | `force: :cascade` to recreate tables referenced by foreign-keys.Yves Senn2014-12-194-4/+13
| |
* | `db:structure:load` and `db:schema:load` no longer purge the database.Yves Senn2014-12-181-2/+0
|/ | | | | | | | | | | | | | | | | Closes #17945 `db:test:prepare` still purges the database to always keep the test database in a consistent state. This patch introduces new problems with `db:schema:load`. Prior to the introduction of foreign-keys, we could run this file against a non-empty database. Since every `create_table` containted the `force: true` option, this would recreate tables when loading the schema. However with foreign-keys in place, `force: true` wont work anymore and the task will crash. /cc @schneems
* Relax the UUID regexGodfrey Chan2014-12-181-9/+2
| | | | | | | | Apparently PG does not validate against RFC 4122. The intent of the original patch is just to protect against PG errors (which potentially breaks txns, etc) because of bad user input, so we shouldn't try any harder than PG itself. Closes #17931
* `update_column` take ruby-land input, not database-land inputSean Griffin2014-12-163-1/+23
| | | | | | | | | | | | | | | In the case of serialized columns, we would expect the unserialized value as input, not the serialized value. The original issue which made this distinction, #14163, introduced a bug. If you passed serialized input to the method, it would double serialize when it was sent to the database. You would see the wrong input upon reloading, or get an error if you had a specific type on the serialized column. To put it another way, `update_column` is a special case of `update_all`, which would take `['a']` and not `['a'].to_yaml`, but you would not pass data from `params` to it. Fixes #18037
* Pass connection rather than alias_trackereileencodes2014-12-131-16/+17
| | | | | | | | | Because we're only using the `connection` so passing the entire tracker isn't unnecessary. Eventually only the `connection` will be passed to `add_constraints` with later refactoring but curretly that's not possible because of `construct_tables` method.
* Merge pull request #17994 from mfazekas/pluck-bind-values-masterSean Griffin2014-12-111-2/+2
|\ | | | | Fix ProtocolViolation/bind message for polymorphic + pluck or group+calc
| * Fix ProtocolViolation/bind message supplies for polymorphic + pluck or groupMiklos Fazkeas2014-12-111-2/+2
| |
* | Merge pull request #17793 from kamipo/fix_undesirable_range_errorSean Griffin2014-12-114-6/+37
|\ \ | | | | | | Fix undesirable RangeError by Type::Integer. Add Type::UnsignedInteger.