1

我在我的API人員控制器中創建了一個創建人員,公司,電子郵件地址和電話號碼的方法。我有一種感覺,我需要包裝所有這些代碼在交易,讓一切都回滾如果事情在代碼塊(如果person.save底部失敗結束不順心,我還是落得與公司,電子郵件等在數據庫中)。我應該將此控制器代碼包裝在ActiveRecord事務中嗎?

這樣做的最好方法是什麼?我可以把所有的條件邏輯放在事務塊裏面嗎?

def create 
    person = Person.new(person_params) 
    person.created_by = current_user.id 
    person.account = current_account 

    if params["company"] && params["company"].length > 1 
    person.company_id = Company.where(name: params["company"], account_id: current_account.id).first_or_create.id 
    end 

    if params["emails"] 
    if params["emails"]["primary"].length > 4 
    person.email_addresses << EmailAddress.create(address: params["emails"]["primary"], addressType: params["emails"]["primary_type"]) 
    end 
    if params["emails"]["secondary"] && params["emails"]["secondary"].length > 4 
     person.email_addresses << EmailAddress.create(address: params["emails"]["secondary"], addressType: params["emails"]["secondary_type"]) 
    end 
    end 

    if params["phonenumbers"] 
    if params["phonenumbers"]["primary"].length > 4 
    person.phone_numbers << PhoneNumber.create(number: params["phonenumbers"]["primary"], numberType: params["phonenumbers"]["primary_type"]) 
    end 
    if params["phonenumbers"]["secondary"] && params["phonenumbers"]["secondary"].length > 4 
     person.phone_numbers << PhoneNumber.create(numberType: params["phonenumbers"]["secondary"], numberType: params["phonenumbers"]["secondary_type"]) 
    end 
    end 

    person.save 

    render json: "Person saved." 
end 

回答

1

是的,你應該。怎麼樣在模型方法中移動整個事物呢?

此外,還有一個重要的事實是,你不應該知道的。如果你這樣做:

person = Person.new 
person.phone_numbers << PhoneNumber.new(...) 
person.save 

Rails會自動構建事務並生成這兩個對象。
這應該允許您改進代碼。

+0

謝謝,這個幫助很大!我只是在Person.new和person.save之間使用.create的。新的來代替。如果person.save失敗,這應該使所有事情都成爲一次交易。 – 502502

相關問題