Как создать каркас для типа данных с "дополнительным описанием" в Rails 3?

С Ruby on Rails: лучший способ обработки валюты / денег, как вы создаете эшафот для folowing:

add_column :items, :price, :decimal, :precision => 8, :scale => 2

, например:

rails generate scaffold LineItem name:string 
                                 price:decimal {:precision => 8, :scale => 2}

кроме того, каков правильный термин для "дополнительного описания" для десятичного типа?

работа в Rails 3.07, Ruby 1.92

6 ответов


В Rails 3.1 и ниже, синтаксис

rails generate scaffold LineItem name:string price:decimal

а затем вручную добавьте десятичные свойства в файл миграции

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

В Rails 3.2, можно указать десятичные свойства

rails generate scaffold LineItem name price:decimal{8,2}

Примечание: Если вы используете ЗШ, синтаксис требует дефиса вместо запятой.

rails generate scaffold LineItem name price:decimal{8-2}

другое Примечание: Если вы используете bash под Mac OS X 10.9 попробуйте точки вместо запятая

rails generate scaffold LineItem name price:decimal{8.2}

почти год спустя. Рельсы 3.2.11. Обычная оболочка bash. Rails scaffold создает беспорядок с синтаксисом field_name: decimal{p, s} независимо от официальный документ railties. Путаница заключается в том, что фигурные скобки являются мета-символами в bash (а также в других оболочках) и должны быть экранированы. См. раздел logged вопрос 4602 в репо генератора ремонтины.

Если вы используете bash, то используйте точку вместо запятой в качестве временного решения.
Правильный синтаксис эшафот field_name: decimal{p.s}


несколько лет спустя, с Rails 4.2 и bash (Linux) следующая команда генератора работает без проблем:

bin/rails generate scaffold LineItem name:string price:decimal{8.2}

это правильно создаст следующий пример миграции:

class CreateLineItems < ActiveRecord::Migration
  def change
    create_table :line_items do |t|
      t.string :name
      t.decimal :price, precision: 8, scale: 2

      t.timestamps null: false
    end
  end
end

новый подход:

создайте миграцию с помощью add_column, например rails generate migration AddPriceToLineItem price:integer

затем отредактируйте миграцию и измените ее так, как вы хотите, например

add_column :line_items, :price, :decimal, :precision => 8, :scale => 2

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


вот как я это сделал:

rails generate scaffold LineItem ... amount:decimal ...

на ... есть ли другие поля, которые нам нужны в эшафоте, как date:date, item:string, category:references...

затем я изменил миграцию, чтобы выглядеть так:

create_table :line_items do |t|
  .
  .
  .
  t.decimal :amount, :precision => 8, :scale => 2

затем

rake db:migrate

это имеет значения от -999,999.99 до 999,999.99.

вот некоторые (незначительно) полезные ссылки: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html


Это самый точный и самый простой способ сделать это в Rails 5.x:

rails generate scaffold LineItem name price:decimal{'8,2'}

обратите особое внимание на одинарные кавычки, используемые при указании масштаба и точности.