我应该将此控制器代码包装在ActiveRecord事务中吗?

时间:2013-07-19 01:26:32

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.1 ruby-on-rails-3.2

我的API PeopleController中有一个Create方法,用于创建人员,公司,电子邮件地址和电话号码。我有一种感觉,我需要将所有这些代码包装在事务中,以便在代码块结束时出现问题时所有内容都会回滚(如果 person.save 在底部失败,我仍然最终在数据库中使用公司,电子邮件等)。

最好的方法是什么?我可以将所有条件逻辑放在事务块中吗?

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 个答案:

答案 0 :(得分:1)

是的,你应该。如何在模型方法中移动整个事物呢?

另外,还有一个重要的事实是你不应该知道。如果你这样做:

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

Rails将自动构建事务并生成两个对象 这应该可以让你改进代码。