以下方法在保存帐户时,在保存用户时,在使用帐户ID更新单元时,在创建新的unit_users记录(将单元与用户关联)时命中数据库。这至少是它击中数据库的4倍:
def activate_new_account(assign_units = [])
account = Account.new(
:name => self.name,
:email => self.email,
:phone => self.phone,
:street_address => self.street_address,
:city => self.city,
:state => self.state,
:postal_code => self.postal_code,
:country => self.country)
errors.clear
error_msgs = []
transaction do
if account.valid?
account.save
user = User.new(:name => self.name,
:email => self.email,
:password => self.password,
:password_confirmation => self.password_confirmation,
:phone => self.phone,
:address => formatted_address,
:role_id => self.user_role_id,
:account_id => account.id)
if user.valid?
user.save
if units_for_account
begin
units = Unit.find(units_for_account.split(" "))
units.each do |unit|
#hitting database twice
unit.update_attributes account_id: account.id
unit.users << user
end
rescue ActiveRecord::RecordNotFound
error_msgs << "Couldn't find all Units with serial numbers: #{units_for_account.split(' ')}"
rescue ActiveRecord::RecordInvalid => invalid
error_msgs << invalid.record.errors
end
end
else
account.destroy
error_msgs << user.errors.full_messages
end
else
error_msgs << account.errors.full_messages
end
end
if error_msgs.size > 0
error_msgs.each do |error|
errors.add :base, error
end
return false
end
return true
end
是否有更多的Railsy方法可以在不影响数据库的情况下做到这一点?
答案 0 :(得分:0)
使用validates_associated
,有更多Rails方法可以完成激活
但它没有更少地访问数据库。您有四个表来更新或添加行,因此您需要四个DB语句。