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