Подтвердить что ты не робот

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

Из 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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Несколько лет спустя, с 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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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