aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/cases/column_test.rb
Commit message (Collapse)AuthorAgeFilesLines
* Change typecasting unit tests to test type objects directlySean Griffin2014-05-231-159/+0
| | | | | | There's no longer type casting behavior of any kind inside of `Column` for the general case. These tests can be made clearer by testing the type objects directly.
* Inline typecasting helpers from Column to the appropriate typesSean Griffin2014-05-201-1/+2
|
* Replace `type_cast` case statement with delegationSean Griffin2014-05-201-1/+1
| | | | | | | | All subclasses of column were now delegating `type_cast` to their injected type object. We can remove the overriding methods, and generalize it on the `Column` class itself. This also enabled us to remove several column classes completely, as they no longer had any meaningful behavior of their own.
* Delegate `#type_cast` to injected type objects on SQLite3Sean Griffin2014-05-201-1/+1
|
* Remove :timestamp column typeSean Griffin2014-05-191-13/+8
| | | | | | | | | | | | The `:timestamp` type for columns is unused. All database adapters treat them as the same database type. All code in `ActiveRecord` which changes its behavior based on the column's type acts the same in both cases. However, when the type is passed to code that checks for the `:datetime` type, but not `:timestamp` (such as XML serialization), the result is unexpected behavior. Existing schema definitions will continue to work, and the `timestamp` type is transparently aliased to `datetime`.
* Delegate `Column#type` to the injected type objectSean Griffin2014-05-191-15/+19
| | | | | | | | | | | | | | | | The decision to wrap type registrations in a proc was made for two reasons. 1. Some cases need to make an additional decision based on the type (e.g. a `Decimal` with a 0 scale) 2. Aliased types are automatically updated if they type they point to is updated later. If a user or another adapter decides to change the object used for `decimal` columns, `numeric`, and `number` will automatically point to the new type, without having to track what types are aliased explicitly. Everything else here should be pretty straightforward. PostgreSQL ranges had to change slightly, since the `simplified_type` method is gone.
* Add a type object to Column constructorSean Griffin2014-05-171-15/+15
| | | | | | Part of #15134. In order to perform typecasting polymorphically, we need to add another argument to the constructor. The order was chosen to match the `oid_type` on `PostgreSQLColumn`.
* Add missing tests for column type cast behaviorSean Griffin2014-05-171-0/+36
|
* prevent global timezone state from leaking out of test cases.Yves Senn2013-10-251-5/+3
|
* ActiveRecord::ConnectionAdapters::Column.string_to_time method respects ↵kennyj2013-09-251-0/+10
| | | | string with timezone. Closes #12278.
* Per #9999 revert the revert changing so columns are only tested for empty? ↵Sam2013-04-031-11/+25
| | | | | | as opposed to blank? This is both faster and more correct, added tests to make sure this is not reverted again.
* Fix error when assigning NaN to an integer columnTristan Harward2013-01-061-0/+6
| | | | | | | | | Also covers any non-castable case by returning nil, which is in-line with the intention of the former implementation, but covers the odd cases which respond to to_i but raise an error when it's called, such as NaN, Infinity and -Infinity. Fixes #8757
* Fix undefined method `to_i' introduced since 3.2.8Jason Stirk2013-01-041-6/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit fixes a bug introduced in 96a13fc7 which breaks behaviour of integer fields. In 3.2.8, setting the value of an integer field to a non-integer (eg. Array, Hash, etc.) would default to 1 (true) : # 3.2.8 p = Post.new p.category_id = [ 1, 2 ] p.category_id # => 1 p.category_id = { 3 => 4 } p.category_id # => 1 In 3.2.9 and above, this will raise a NoMethodError : # 3.2.9 p = Post.new p.category_id = [ 1, 2 ] NoMethodError: undefined method `to_i' for [1, 2]:Array Whilst at first blush this appear to be sensible, it combines in bad ways with scoping. For example, it is common to use scopes to control access to data : @collection = Posts.where(:category_id => [ 1, 2 ]) @new_post = @collection.new In 3.2.8, this would work as expected, creating a new Post object (albeit with @new_post.category_id = 1). However, in 3.2.9 this will cause the NoMethodError to be raised as above. It is difficult to avoid triggering this error without descoping before calling .new, breaking any apps running on 3.2.8 that rely on this behaviour. This patch deviates from 3.2.8 in that it does not retain the somewhat spurious behaviour of setting the attribute to 1. Instead, it explicitly sets these invalid values to nil : p = Post.new p.category_id = [ 1, 2 ] p.category_id # => nil This also fixes the situation where a scope using an array will "pollute" any newly instantiated records. @new_post = @collection.new @new_post.category_id # => nil Finally, 3.2.8 exhibited a behaviour where setting an object to an integer field caused it to be coerced to "1". This has not been retained, as it is spurious and surprising in the same way that setting Arrays and Heshes was : c = Category.find(6) p = Post.new # 3.2.8 p.category_id = c p.category_id # => 1 # This patch p.category_id = c p.category_id # => nil This commit includes explicit test cases that expose the original issue with calling new on a scope that uses an Array. As this is a common situation, an explicit test case is the best way to prevent regressions in the future. It also updates and separates existing tests to be explicit about the situation that is being tested (eg. AR objects vs. other objects vs. non-integers)
* Fix bug when Column is trying to type cast boolean values to integer.Rafael Mendonça França2012-10-291-4/+4
| | | | | | | | | | | This can occur if the user is using :integer columns to store boolean values. Now we are handling the boolean values but it still raises if the value can't type cast to integer and is not a boolean. See #7509. Fixes #8067. Conflicts: activerecord/CHANGELOG.md
* fix quoting for ActiveSupport::Duration instancesFrancesco Rodriguez2012-07-041-0/+6
| | | | | | | | | | | | | | | | This patch fixes quoting for ActiveSupport::Duration instances: # before >> ActiveRecord::Base.connection.quote 30.minutes => "'--- 1800\n...\n'" # after >> ActiveRecord::Base.connection.quote 30.minutes => "1800" Also, adds a test for type casting ActiveSupport::Duration instances. Related to #1119.
* Prevent creating valid time-like objects from blank string from dbEgor Lynko2012-05-051-0/+28
| | | | Issue #6045
* Don't type cast values that don't respond to to_i to 1James Sanders & Jason Noble2012-04-301-0/+24
|
* on and ON are type casted to a true boolean columnSantiago Pastorino2012-01-111-0/+29