aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters/column.rb
Commit message (Collapse)AuthorAgeFilesLines
* Remove unused text? predicate method and delegationCarlos Antonio da Silva2014-08-051-1/+1
| | | | | | | | The method has been removed in 09206716f8695f6b8467f15c1befa5a4c3c10978 (PR #16074), but the delegation was apparently missed, and one instance of the method was added back with the addition of OID::Xml in 336be2bdf7dfa1b31879d0ab27e5f3101b351923 (PR #16072), so we can safely rm both.
* Add a deprecation cycle for `NullColumn` from `column_for_attribute`Sean Griffin2014-06-231-6/+0
| | | | | | This is public API, and `simple_form` depends on the `nil` return value. We need to go through a deprecation cycle to return a null object. If people want hash access, they can access the hash.
* Don't type cast the default on the columnSean Griffin2014-06-171-7/+2
| | | | | | | If we want to have type decorators mess with the attribute, but not the column, we need to stop type casting on the column. Where possible, we changed the tests to test the value of `column_defaults`, which is public API. `Column#default` is not.
* Remove `serialized?` from the type interfaceSean Griffin2014-06-131-1/+1
|
* Remove YAML serialization workaround for columnsSean Griffin2014-06-111-6/+2
| | | | | We are no longer including column objects in YAML serialization, thanks to https://github.com/rails/rails/pull/15621
* Keep the types of virtual columns after yaml serializationSean Griffin2014-06-101-2/+6
| | | | | On MySQL and PostgreSQL, the adapter does not type cast virtual columns for us.
* Rename `type_cast` to `type_cast_from_database`Sean Griffin2014-06-091-2/+2
| | | | | | | | In some cases there is a difference between the two, we should always be doing one or the other. For convenience, `type_cast` is still a private method on type, so new types that do not need different behavior don't need to implement two methods, but it has been moved to private so it cannot be used accidentally.
* Make `_before_type_cast` actually be before type castSean Griffin2014-06-091-1/+1
| | | | | | | | | | | | | - The following is now true for all types, all the time - `model.attribute_before_type_cast == given_value` - `model.attribute == model.save_and_reload.attribute` - `model.attribute == model.dup.attribute` - `model.attribute == YAML.load(YAML.dump(model)).attribute` - Removes the remaining types implementing `type_cast_for_write` - Simplifies the implementation of time zone aware attributes - Brings tz aware attributes closer to being implemented as an attribute decorator - Adds additional point of control for custom types
* Don't query the database schema when calling `serialize`Sean Griffin2014-06-071-4/+11
| | | | | | We need to decorate the types lazily. This is extracted to a separate API, as there are other refactorings that will be able to make use of it, and to allow unit testing the finer points more granularly.
* have an actual `NullColumn` object and update docs accordingly.Yves Senn2014-06-041-0/+6
| | | | | | Follow up to #15438 and #15502. /cc @sgrif
* Merge pull request #15492 from sgrif/sg-dirty-defaultsRafael Mendonça França2014-06-031-1/+1
|\ | | | | Keep column defaults in type cast form
| * Keep column defaults in type cast formSean Griffin2014-06-031-1/+1
| | | | | | | | | | | | | | | | | | | | The contract of `_field_changed?` assumes that the old value is always type cast. That is not the case for the value in `Column#default` as things are today. It appears there are other public methods that assume that `Column#default` is type cast, as well. The reason for this change originally was because the value gets put into `@raw_attributes` in initialize. This reverts to the old behavior on `Column`, and updates `initialize` to make sure that the values are in the right format.
* | Refactor determination of whether the field has changedSean Griffin2014-06-031-1/+1
|/ | | | | The types know more about what is going on than the dirty module. Let's ask them!
* Remove most code related to serialized propertiesSean Griffin2014-06-011-2/+2
| | | | | | | | | | | Nearly completely implemented in terms of custom properties. `_before_type_cast` now stores the raw serialized string consistently, which removes the need to keep track of "state". The following is now consistently true: - `model.serialized == model.reload.serialized` - A model can be dumped and loaded infinitely without changing - A model can be saved and reloaded infinitely without changing
* refactor, introduce `Type#type_cast_for_schema` to cast for schema.rbYves Senn2014-05-301-0/+1
| | | | | | | This removes the case statement in `SchemaDumper` and gives every `Type` the possibility to control the SchemaDumper default value output. /cc @sgrif
* Move `type_cast_for_write` behavior over to the serialized type objectSean Griffin2014-05-291-1/+1
|
* Refactor serialized types to be partially defined as custom propertiesSean Griffin2014-05-291-2/+4
| | | | | | | Many of the methods defined in `AttributeMethods::Serialization` can be refactored onto this type as well, but this is a reasonable small step. Removes the `Type` class, and the need for `decorate_columns` to handle serialized types.
* Remove unused `Column#coder`Sean Griffin2014-05-281-14/+1
| | | | | It appears this property was added, but never actually used. It would be broken if it were, as it only type casts one way.
* Add an interface for type objects to control Ruby => SQLSean Griffin2014-05-261-1/+2
| | | | | Adds the ability to save custom types, which type cast to non-primitive ruby objects.
* Remove `Column#primary`Sean Griffin2014-05-231-2/+1
| | | | | | | | It appears to have been used at some point in the past, but is no longer used in any meaningful way. Whether a column is considered primary is a property of the model, not the schema/column. This also removes the need for yet another layer of caching of the model's schema, and we can leave that to the schema cache.
* Push limit to type objectsSean Griffin2014-05-221-8/+2
| | | | | Columns and injected types no longer have any conditionals based on the format of SQL type strings! Hooray!
* Push precision to type objectsSean Griffin2014-05-221-5/+2
|
* Push scale to type objectsSean Griffin2014-05-221-4/+3
| | | | | | Ideally types will be usable without having to specify a sql type string, so we should keep the information related to parsing them on the adapter or another object.
* Move `extract_precision` onto type objectsDan Croak and Sean Griffin2014-05-221-5/+1
|
* push `extract_scale` to the `Type`.Yves Senn2014-05-211-1/+1
| | | | | | | - `extract_precision`, `extract_limit`, and `extract_default` probably need to follow. - would be good to remove the delegation `Column#extract_scale`. /cc @sgrif
* Delegate `klass` to the injected type objectSean Griffin2014-05-201-14/+1
|
* Delegate `type_cast_for_write` to injected type objectSean Griffin2014-05-201-19/+1
|
* Merge pull request #15207 from sgrif/sg-inline-column-helpersRafael Mendonça França2014-05-201-112/+0
|\ | | | | Inline typecasting helpers from Column to the appropriate types
| * Inline typecasting helpers from Column to the appropriate typesSean Griffin2014-05-201-112/+0
| |
* | Delegate predicate methods to injected type object on ColumnSean Griffin2014-05-201-15/+1
|/
* Replace `type_cast` case statement with delegationSean Griffin2014-05-201-22/+4
| | | | | | | | 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 object in mysqlSean Griffin2014-05-201-15/+2
|
* Remove :timestamp column typeSean Griffin2014-05-191-2/+2
| | | | | | | | | | | | 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-36/+5
| | | | | | | | | | | | | | | | 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-1/+3
| | | | | | 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`.
* [ci skip] document type_cast_for_writeschneems2014-05-071-0/+2
|
* Coerce strings when reading attributes.Yves Senn2014-02-231-2/+8
|
* Push default_function to superclass to avoid method checkRafael Mendonça França2013-10-141-11/+12
|
* ActiveRecord::ConnectionAdapters::Column.string_to_time method respects ↵kennyj2013-09-251-3/+11
| | | | string with timezone. Closes #12278.
* Stop interpreting SQL 'string' columns as :string type.Ben Woosley2013-08-171-1/+1
| | | | | | | | SQL doesn't have a string type, and interpreting 'string' as text is contrary to at least SQLite3's behavior: "Note that a declared type of 'STRING' has an affinity of NUMERIC, not TEXT." http://www.sqlite.org/datatype3.html
* Remove redundant `string_to_binary` from type-castingVipul A M2013-08-091-10/+0
|
* Removed deprecated method type_cast_code from ColumnNeeraj Singh2013-07-021-24/+0
|
* Per #9999 revert the revert changing so columns are only tested for empty? ↵Sam2013-04-031-4/+4
| | | | | | as opposed to blank? This is both faster and more correct, added tests to make sure this is not reverted again.
* Revert "Merge pull request #9784 from ↵Carlos Antonio da Silva2013-03-181-4/+4
| | | | | | | | | | vipulnsward/change_from_blank_to_empty_on_string" This reverts commit 9c4c05fc82e997b722dec4068c3aa27eaee69eb8, reversing changes made to 4620bdcefd0c88905a005f191496df887877b8f3. Reason: They're not completely interchangeable, since blank? will also check for strings containing spaces.
* change from blank? to empty? on obvious string values to save extra method ↵Vipul A M2013-03-191-4/+4
| | | | calls
* 9253: Before writing a numeric attribute value, ActiveRecord does an implicitRyan Warnick2013-02-131-4/+5
| | | | | | conversion of boolean types (true => 1 and false => 0). If the numeric value being assigned is a BigDecimal, then ActiveRecord compares a BigDecimal to true and false. This is known to be very slow in Ruby 1.9.3.
* Add postgresql range types supportbUg2013-01-231-1/+0
|
* Fix error when assigning NaN to an integer columnTristan Harward2013-01-061-5/+1
| | | | | | | | | 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-1/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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)
* AR supporting new intrange data type on PostgreSQL >= 9.2Alexey2012-12-161-0/+1
|