ActiveRecord третира атрибута като цяло число, когато е десетичен в MySQL

Тук имам чувството, че пия луди хапчета. Имам клас ActiveRecord, поддържан от MySQL, и редица атрибути се отчитат в Rails като тип Integer:

Device.last.score.class # returns `Fixnum`

MySQL съобщава, че колоната е от тип decimal(10,0).

Какво ми липсва тук? Дори опитах да се обадя на reset_column_information. Миграцията изглежда правилна и файлът със схема също изглежда добре.

Забележка: този проблем не се случваше в dev, където използвам SQLite.

Ето моята миграция:

class AddScoreColumnToDevices < ActiveRecord::Migration
    def change  
        add_column :devices, :score, :decimal
    end
end

person YWCA Hello    schedule 12.09.2013    source източник
comment
Ако приемем, че имате някакви записи там, какво отчита Device.first.score.class? (вместо Device.new)   -  person Michael Berkowski    schedule 12.09.2013
comment
Fixnum също. Не бях прав по-горе, Device.new.score.class всъщност връща NilClass по очевидни причини. Поправя това сега.   -  person YWCA Hello    schedule 12.09.2013
comment
Можете ли да запазите ново устройство с плаващ/десетичен резултат? Device.create(score: 11.11)?   -  person Carlos Drew    schedule 13.09.2013
comment
Освен това бих предложил да публикувате кода на модела на вашето устройство и миграцията, която сте използвали, за да създадете таблицата/колоната с резултат на устройството. Това ще помогне за по-бързия отговор на въпроса ви...   -  person Carlos Drew    schedule 13.09.2013
comment
@CarlosDrew Новите записи имат същия проблем. Публикувах миграцията по-горе; изключително ванилов е. Не включих дефиницията на класа, защото дори не споменавам атрибута :score в нея. Това е основен моделен клас, който наследява директно от ActiveRecord::Base.   -  person YWCA Hello    schedule 13.09.2013


Отговори (1)


Миграцията го направи вместо мен! Благодаря ти!

Стойностите по подразбиране за новомигриран :decimal са :precision => 0 и :scale => 0, което ще доведе до десетична запетая на MySQL, която не приема нищо след десетичната точка.

Ruby ще види това число, без нищо след десетичната запетая, като Fixnum, което е това, което наблюдавате.

Така че трябва да напишете нова миграция, за да промените колоната и да дадете десетична точност и мащаб > 0.

change_column :devices, :score, :decimal, :precision => 10, :scale => 10

Препратки:
ActiveRecord ConnectionAdapter TableDefinition #column
десетична точност и мащаб
стара препратка към MySQL колона‹->Съпоставяне на тип данни Ruby

person Carlos Drew    schedule 13.09.2013