运行 进入未定义的方法 `price_cents'
Running into undefined method `price_cents'
已将 money-rails
gem 添加到我的应用程序。
已将其列迁移到我的模型中 Item
迁移
class AddPriceToItems < ActiveRecord::Migration[5.0]
def change
add_column :items, :price, :money
end
end
模型项目
class Item < ApplicationRecord
belongs_to :invoice
validates_numericality_of :unit_price, :quantity
monetize :price_cents
end
架构
ActiveRecord::Schema.define(version: 20170223211329) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
create_table "invoices", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "items", force: :cascade do |t|
t.decimal "unit_price", precision: 10, scale: 2
t.integer "quantity"
t.integer "invoice_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.money "price", scale: 2
t.index ["invoice_id"], name: "index_items_on_invoice_id", using: :btree
end
add_foreign_key "items", "invoices"
end
这是我 运行 进入
的错误
undefined method `price_cents' for #<Item:0x007f9f6b366ae8>
Did you mean? price_cents=
不确定如何解决这个问题。
编辑
好的,我删除了价格列,并将其作为整数添加回 price_cents 列...
但是,在模式中应该是这样的:
t.integer "price_cents"
..
或
t.monetize "price_cents"
您的模型应该有一个整数(不是货币类型)price_cents 列,而不是价格。传递给货币化的符号应该是该列。看这里:https://github.com/RubyMoney/money-rails#usage-example
您的专栏名称需要 price_cents
而不是 price
。
您的列的类型需要是 integer
。
我认为你试图复制
add_money :products, :price
但你使用了 add_column
而不是 add_money
。
我最近使用了这个 gem,但是 add_money
助手未定义,所以我使用了
add_column :items, :price_cents, :integer
我认为它不适用于 money
列类型
如果你想确保你的金额 adding/multiplying 不会给出不准确的金额或产品(如 $14.099..),那么你可以考虑走这条路:
1) 生成 Items 模型时使用此
price:monetize
2) 在您的迁移文件中,这将反映为:
t.monetize :price
3) 在 运行 rails db:migrate
之后,这将在您的 ItemsTable 中生成两列:
第一列将是 price_cents
(这将是以美分为单位的项目金额,(例如 1000 = $10)
第二列会是price_currency(比如$),在schema.rb
中默认是USD
t.integer "price_cents", default: 0, null: false
t.string "price_currency", default: "USD", null: false
已将 money-rails
gem 添加到我的应用程序。
已将其列迁移到我的模型中 Item
迁移
class AddPriceToItems < ActiveRecord::Migration[5.0]
def change
add_column :items, :price, :money
end
end
模型项目
class Item < ApplicationRecord
belongs_to :invoice
validates_numericality_of :unit_price, :quantity
monetize :price_cents
end
架构
ActiveRecord::Schema.define(version: 20170223211329) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
create_table "invoices", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "items", force: :cascade do |t|
t.decimal "unit_price", precision: 10, scale: 2
t.integer "quantity"
t.integer "invoice_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.money "price", scale: 2
t.index ["invoice_id"], name: "index_items_on_invoice_id", using: :btree
end
add_foreign_key "items", "invoices"
end
这是我 运行 进入
的错误undefined method `price_cents' for #<Item:0x007f9f6b366ae8>
Did you mean? price_cents=
不确定如何解决这个问题。
编辑
好的,我删除了价格列,并将其作为整数添加回 price_cents 列...
但是,在模式中应该是这样的:
t.integer "price_cents"
..
或
t.monetize "price_cents"
您的模型应该有一个整数(不是货币类型)price_cents 列,而不是价格。传递给货币化的符号应该是该列。看这里:https://github.com/RubyMoney/money-rails#usage-example
您的专栏名称需要 price_cents
而不是 price
。
您的列的类型需要是 integer
。
我认为你试图复制
add_money :products, :price
但你使用了 add_column
而不是 add_money
。
我最近使用了这个 gem,但是 add_money
助手未定义,所以我使用了
add_column :items, :price_cents, :integer
我认为它不适用于 money
列类型
如果你想确保你的金额 adding/multiplying 不会给出不准确的金额或产品(如 $14.099..),那么你可以考虑走这条路:
1) 生成 Items 模型时使用此
price:monetize
2) 在您的迁移文件中,这将反映为:
t.monetize :price
3) 在 运行 rails db:migrate
之后,这将在您的 ItemsTable 中生成两列:
第一列将是 price_cents
(这将是以美分为单位的项目金额,(例如 1000 = $10)
第二列会是price_currency(比如$),在schema.rb
t.integer "price_cents", default: 0, null: false
t.string "price_currency", default: "USD", null: false