2017-01-09 14 views
1

Я создаю приложение Rails, которое позволяет пользователю каталогизировать шины, вводя значения в пользовательский интерфейс. Когда я создал tire класс, я сделал это, какЯ не уверен, что правильно применяю миграцию изменений Rails

class CreateArticles < ActiveRecord::Migration[5.0] 
    def change 
    create_table :tires do |t| 
     t.decimal :price 
     ... 
    end 
end 

Когда я запускал программу, я понял, что я забыл указать точность и масштаб атрибута decimal. Это привело к тому, что программа не смогла принять нецелые значения и отобразить все значения, добавленные .0 Поскольку я был намного дальше по программе, я решил написать еще одну миграцию, чтобы просто изменить price на float, написав следующую миграцию:

class ChangeTiresToFloat < ActiveRecord::Migration[5.0] 
    def change 
    change_column :tires, :price, :float 
    end 

После запуска db:migrate, нет никаких изменений в поведении программы. Должно ли это не сделать так, чтобы пользовательский интерфейс мог принимать значения float?

Edit: Прежде чем прибегать к делая price столбец значение с плавающей точкой, я пытаюсь исправить значение decimal, добавив недостающие атрибуты этой миграции:

class MoneyDecimalFix < ActiveRecord::Migration[5.0] 
    def change 
    change_column :tires, :price, :decimal, :precision => 8, :scale => 2 
    end 
end 

После наката миграции, поведение программы все еще не изменился.

+1

Не использовать поплавки для цен , http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency – max

+1

Согласитесь с @max, вы можете использовать денежную библиотеку, такую ​​как https://github.com/RubyMoney/money-rails –

+0

Хотя после этого я планирую перейти на библиотеку Money после обновления, мне сначала хотелось узнать, что моя ошибка при реализации миграции. Почему это происходит, что движение вперед не приводит к изменению поведения программы. –

ответ

0

Хотя можно использовать change_column миграции редактировать значение цены включать спецификации атрибута decimal, потому что create_table является обратимой миграции, то целесообразно вместо катать миграции назад и вручную осуществить изменение в конечном счете чтения

t.decimal :price, :precision => 8, :scale => 2

затем обвалять миграции вперед.

Однако стоит отметить, что хотя наличие нулевого столбца price является важным шагом, оно само по себе не устраняет проблему формы, не принимающей десятичные значения.

Ошибка была в конечном счете в моих представлениях. В Rails, то number_field тег, само по себе, не будет принимать десятичные значения, оно должно быть «в сочетании» с text_field тега, чтобы сделать так, как, например:

<%= f.number_field :price, class: :text_field, step: :any %>