【问题标题】:Rails update the stock value of a productRails 更新产品的库存价值
【发布时间】:2016-08-21 05:29:25
【问题描述】:

我有一个模型 Payment 和一个控制器名称 payment_controller。 Payment 模型的架构类似于

class CreatePayments < ActiveRecord::Migration
  def change
    create_table :payments do |t|
        t.belongs_to :user
        t.decimal :ammount, :precision => 8, :scale => 2, null: false
        t.decimal :balance, :precision => 8, :scale => 2, null: false
      t.timestamps null: false
    end
  end
end

我可以向数据库中添加条目,但我想要做的是每次用户添加付款时,余额字段应更新为先前余额和新金额的总和。我不知道该怎么做。请帮我。

我在控制器代码中做了一些小改动。在我尝试更新付款模型中的余额之前,但现在我尝试更新用户模型中的余额。还是错误。

user = current_user
netamt =  (amount.to_f - ((amount.to_f*2.9)/100 + 0.30))
payment = user.payments.create(:ammount => netamt)
user.update_attribute(balance: user.balance + netamt)

【问题讨论】:

  • 只是加法吧?你能解决什么问题balance += payment_amount
  • 还是一头雾水。假设用户 A 在 db 字段中有 60 美元作为余额。如果他再次添加 30 美元,金额字段应为 30 美元,余额字段应为 30 美元 + 60 美元,总计 90 美元。
  • 是的,你可以这样做:amount = new_amount 然后balance += amount
  • 如果不是您的情况,请发布您的控制器代码..
  • 为什么是付款模式的余额?我的建议:不要使用回调,它们会在以后和测试时造成麻烦。使其成为将两个数据库操作包装在事务中的方法。

标签: ruby-on-rails ruby


【解决方案1】:

在付款中存储余额不是一个好主意。我认为您可以在用户模型中存储余额。在这种情况下,您的代码将是这样的:

begin
  Payment.create(amount: 100, user: user)
  user.update_attribute(:balance, user.balance + 100)
rescue
 #handle a error
end

如果你想用你的case,你可以试试:

balances = Payment.where(user: user).order(:created_at)
if balances.any?
  Payment.create(user: user, amount: amount, balance: balances.last.balance + amount)
end

【讨论】:

  • 我跟着你,更新控制器代码。请看我上面的问题。仍然出现错误,例如错误的 agument
  • 代码user.update_attribute(balance: (user.balance + netamt))的错误参数数量错误(1 对2)
  • 非常抱歉,我的帖子中有错误 - update_attributes 需要两个像这样的参数 user.update_attributes(:balance, new_balance)
【解决方案2】:

我认为您可以在 Payment Model 中做到这一点。首先,通过运行迁移以实现更改,为 balanceamount 提供默认值 0.0。然后你可以在模型中做这样的事情:

def update_balance
  self.balance += self.amount
end

然后你可以在这个方法上面添加一个回调说:

before_create :update_balance

我想这应该会有所帮助。

【讨论】:

  • 我收到以下错误。 nil:NilClass 的未定义方法“+”
  • 是的@SantoshAryal。默认值应为paymentamount。如果其中任何一个最初是nil,则该操作是不可能的。您是否为此进行了迁移?
  • 尝试after_save回调。
【解决方案3】:

我可以向数据库中添加条目,但我想要做的是每次用户添加付款时,余额字段应更新为先前余额和新金额的总和。我不知道该怎么做。请帮帮我。

您可以使用Active Record Callback 来完成。使用您的模型进行回调,如果有人添加付款,请致电 after_save your_method 并执行您想要的操作(在您的情况下,您必须更新该字段)。

after_save :update_payment_amount

def update_payment_amount
  // do stuffs here
end

【讨论】:

    猜你喜欢
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多