2017-07-17 26 views
0

這項工作?我想要做的事就像硬幣轉移如何在表單提交後執行ActiveRecord查詢?

@logs = Logs.new(log_params) 
@logs.save 
@tt = Users.where(email: params[:email]).update(money: Users.find(current_user.id)['money'] - params[:money]) 
@tt.save 
@wr = Users.find(current_user.id).update(money: Users.where(email: params[:email])['money'] + params[:money]) 
@wr.save 
+0

我建議在交易中包裝併爲您的貨幣對象使用可靠的驗證服務。不要簡單地通過'params [:money]'。不要惹$$$ ^^。 –

+0

更好的是,您可以創建一個MoneyTransfer模型來跟蹤交易。餘額將是所有交易應用後的快照。否則,事情可能會變得混亂。 –

+0

謝謝你,這真的很有用 – Fluffy

回答

1

我不知道,如果您計劃在您的視圖來顯示這些值,但你可以做這樣的事情:

sender = Users.where(email: params[:email]).first 
# This returns the user 
recipient = Users.find(current_user.id) 
# or just current_user if it inherit from the User class 
money_to_substract = recipient.money - params[:money] 
money_to_sum = recipient.money + params[:money] 

然後你transsaction會有點dryier

User.transaction do 
    @logs = Logs.new(log_params) 
    @tt = sender.update(money: money_to_substract) 
    # update saves to the database so no need to call save 
    # @tt.save 
    @wr = recipient.update(money: money_to_sum) 
    # update saves to the database so no need to call save 
    # @wr.save 
end 

但恕我直言,我會做這樣的事情:

型號/ User.rb

class User < ActiveRecord::Base 

    ... 

    def sends_money(amount) 
    money_to_substract = self.money - amount 
    update(money: money_to_substract) 
    end 

    def receives_money(amount) 
    money_to_sum = self.money + amount 
    update(money: money_to_sum) 
    end 

    ... 

end 

在你的控制器

amount = params[:money].to_i 
User.transaction do 
    @logs = Logs.new(log_params) 
    @tt = sender.sends_money(amount) 
    @wr = recipient.receives_money(amount) 
end 

這使得事情更容易閱讀,並按照通過您的代碼。

希望這會有所幫助!

+0

@Fluffy,你可以嘗試以上任何一種嗎? – Jeremie

+0

我試過了,一切正常 – Fluffy

相關問題