Как создать скаффолд для типа данных с «дополнительным описанием» в Rails 3? - PullRequest
22 голосов
/ 05 марта 2012

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

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 ]

51 голосов
/ 16 апреля 2012

В 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}

ПРИМЕЧАНИЕ. Если вы используете ZSH , для синтаксиса вместо де запятой требуется дефис.

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

ДРУГОЕ ПРИМЕЧАНИЕ: если вы используете bash под Mac OS X 10.9 , попробуйте точку вместо запятой

rails generate scaffold LineItem name price:decimal{8.2}
11 голосов
/ 30 ноября 2015

Несколько лет спустя, с 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
11 голосов
/ 17 января 2013

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

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

3 голосов
/ 06 марта 2012

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

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

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

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

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

2 голосов
/ 06 марта 2012

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

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

1 голос
/ 08 декабря 2017

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

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

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

...