运行未定义的方法`price_cents'

时间:2017-02-24 19:38:47

标签: ruby-on-rails ruby money-rails

已将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"

3 个答案:

答案 0 :(得分:1)

您的列名称必须为price_cents而不是price

您的列类型必须为integer

我认为你试图复制

add_money :products, :price

但您使用add_column代替add_money

我最近使用过这个gem,但add_money助手未定义,所以我使用了

add_column :items, :price_cents, :integer

我认为它不适用于money列类型

答案 1 :(得分:1)

如果您要确保您添加/倍增的金额不会给出不准确的金额或产品(例如$ 14.099 ..),那么您可以考虑走这条路:

1)生成项目模型时,请使用此项 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

答案 2 :(得分:0)

您的模型应该有一个整数(不是货币类型)price_cents列,而不是价格。传递给货币化的符号应该是该列。见这里:https://github.com/RubyMoney/money-rails#usage-example