Rails overriding database default value?

Hello.

This is a new post for a message I didn't get any answers to. I hope
this post catches somebody's eye and helps me with the issue. Sorry
for the duplication but this is driving me nuts.

The environment is:
- Ruby version is 1.8.6
- Rails version is 1.2.3.
- Database is Oracle (10g) in which I have a table with one defined
as:
     MY_FIELD NUMBER(1,0) DEFAULT '2'

When a record is created in the database the value that invariable
gets posted to the table is 0 (zero) instead of 2. However, if I
change the field to:
     MY_FIELD NUMBER(2,0) DEFAULT '2', the default value of 2 is
correctly posted.

Is there a reason Rails would override the value for a NUMBER(1,0)
field? Is it believing that the field is a true/false container and
changes the default to a 0 (zero) since it is not a 1 ('true')?

Any ideas why this is happening and/or how to solve it short of
modifying the column's length?

Thanks in advance.

Pepe

Hello.

This is a new post for a message I didn't get any answers to. I hope
this post catches somebody's eye and helps me with the issue. Sorry
for the duplication but this is driving me nuts.

The environment is:
- Ruby version is 1.8.6
- Rails version is 1.2.3.
- Database is Oracle (10g) in which I have a table with one defined
as:
    MY_FIELD NUMBER(1,0) DEFAULT '2'

When a record is created in the database the value that invariable
gets posted to the table is 0 (zero) instead of 2. However, if I
change the field to:
    MY_FIELD NUMBER(2,0) DEFAULT '2', the default value of 2 is
correctly posted.

Is there a reason Rails would override the value for a NUMBER(1,0)
field? Is it believing that the field is a true/false container and
changes the default to a 0 (zero) since it is not a 1 ('true')?

Any ideas why this is happening and/or how to solve it short of
modifying the column's length?

Well the mysql adapter has a MysqlAdapter.emulate_booleans setting
that does that with tinyint(1) columns.

The oracle adapter could conceivably be doing the same thing - check
the source!

Fred

Thanks Fred.

Pepe

Thanks Fred,

I found what I was looking for. I found the code for the adapter and
these 2 lines are pretty revealing:

          return :boolean if OracleAdapter.emulate_booleans &&
field_type == 'NUMBER(1)'

        @@emulate_booleans = true

Thanks a lot for your help. :slight_smile:

Pepe