ActiveRecord bug? ActiveRecord::ConnectionAdapters::Column.type_cast for float columns

Hi all,

I just noticed that in ActiveRecord::ConnectionAdapters::Column.type_cast[1] (and type_cast_code[2]) the type casting for float columns simply does value.to_f, whereas all the others have a rescue or call out to a method, the default implementations of which have rescues or enough logic in that I don’t think they’d fail.

Imagine the following:

create_table :vehicle do |t|

Now, doing some archaeology on trac, I’ve found that the rescue for integer columns was added way back in changeset 928 [3] based on ticket 820 [4]. Putting a rescue block on the type cast would be nice and consistent, and simple, so I can create a patch for this easily. However, I haven’t created a patch for this super-tiny thing as I don’t really know if it’s intentionally missing or not. I just want some feedback on if this is expected behaviour or not before I patch it up (and deal with the no-doubt cascade of failing tests from changing the behaviour).

If it’s expected behaviour I’ll just patch my version of rails for this app.

[1] http://dev.rubyonrails.org/browser/trunk/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb#L57 [2] http://dev.rubyonrails.org/browser/trunk/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb#L75 [3] http://dev.rubyonrails.org/changeset/928 [4] http://dev.rubyonrails.org/ticket/820

Crap, I wasn’t finished writing this. Curse gmail! (and not my fingers, no, not their fault at all).

Hi all,

I just noticed that in ActiveRecord::ConnectionAdapters::Column.type_cast[1] (and type_cast_code[2]) the type casting for float columns simply does value.to_f, whereas all the others have a rescue or call out to a method, the default implementations of which have rescues or enough logic in that I don’t think they’d fail.

Imagine the following:

create_table :vehicle do |t|

t.integer :wheels t.float :top_speed end

v = Vehicle.new v.wheels = v.wheels #=> 0

v.top_speed =

v.top_speed #=> NoMethodError: undefined method `to_f’ for :Array

It seems that we should be able to set wheels and top_speed to be the same wonky value if we want and have AR cope with that (we’ll use validations to complain to the user later).

For those who care, a patch to resolve this: http://dev.rubyonrails.org/ticket/11398