Как создать эшафот для типа данных с "дополнительным описанием" в 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
Ответы
Ответ 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'}
Обратите особое внимание на одинарные кавычки, используемые при определении масштаба и точности.