2016-04-27 3 views
0

У меня есть модель платежа и имя контроллера payment_controller. Схема модели оплаты, как вRails обновляет стоимость акций продукта

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) 
+1

Это просто дополнение? В чем проблема, вы можете просто сделать «balance + = payment_amount» –

+0

Все еще запутано. Предположим, что пользователь A имеет 60 долларов в качестве баланса в поле db. И если он добавит 30 долларов снова, то в поле суммы должно быть 30 долларов США, а поле баланса должно составлять 30 + 60 долларов США всего 90 долларов США. –

+0

Да, вы можете сделать так: 'amount = new_amount', а затем' balance + = amount' –

ответ

0

Хранить остаток в платеже не очень хорошо. Я думаю, вы можете сохранить баланс в пользовательской модели. В этом случае ваш код будет выглядеть так:

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

Если Вы хотите использовать свой случай, Вы можете попробовать следующий:

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

Я последовал за тобой, обновил код контроллера. См. Мой вопрос выше. –

+0

Получил ошибку _wrong количество аргументов (1 для 2) _ для кода ** user.update_attribute (баланс: (user.balance + netamt)) ** –

+0

Мне очень жаль, у меня есть ошибка в моем post - update_attributes ожидают два аргумента, подобных этому ** user.update_attributes (: balance, new_balance) ** – kunashir

0

Я думаю, что вы можете сделать это в вашей Payment Model. Сначала дайте balance и amount значение по умолчанию 0.0, выполнив миграцию, чтобы произвести изменение. Затем вы можете сделать что-то подобное в модели:

def update_balance 
    self.balance += self.amount 
end 

Затем вы можете добавить выше этот метод говорит обратный вызов:

before_create :update_balance 

Я думаю, это должно помочь.

+0

Я получил следующую ошибку.undefined method '+ 'для nil: NilClass –

+0

Да @SantoshAryal. Значения по умолчанию должны быть как для «оплаты», так и для «суммы». Если какой-либо из них сначала «ниль», операция невозможна. Вы выполнили миграцию, чтобы сделать это? – mokayode

+0

да и значения есть 0.0 –

0

Я могу добавить записи в базу данных, но я хочу, чтобы каждый раз, когда пользователь добавляет платежи, поле баланса должно обновляться с суммой предыдущего баланса и новой суммы. Я не знаю, как это сделать. пожалуйста помогите.

Вы можете сделать это, используя Active Record Callback. Сделайте обратный вызов с помощью своей модели, если кто-то добавит платежные вызовы after_save your_method и сделает необходимые вам вещи (в вашем случае вы должны обновить поле).

after_save :update_payment_amount 

def update_payment_amount 
    // do stuffs here 
end 
Смежные вопросы