I’m trying to delete an account but at the same time i’d like to
delete the portals that belongs to the account.
This is what i wrote but it’s not working.
how can i deal with this problem?
I have this code inside the account controller in the “destroy” method
def destroy
@account = Account.find(params[:id])
@portal = Portal.find(:all, :conditions => [‘account_id = ?’,
@account.id ])
@portal.destroy
@account.destroy
end
any ideas?
the error displays this:
NoMethodError in AccountsController#destroy
undefined method destroy' for #<Array:0x47982a0> app/controllers/accounts_controller.rb:78:indestroy’
Request
Parameters:
{"_method"=>“delete”,
“authenticity_token”=>“f8c32ed76159e1b51b0883ef72a4ab801b92d322”,
“id”=>“11”}
I’m guessing the error is coming on line:
@portal.destroy
Right? The reason why is that:
@portal = Portal.find(:all, :conditions => [‘account_id = ?’,
@account.id ])
returns an array, even if there is only one result. Check this out:
User.find(:all, :conditions => “id = 1”).class
=> Array
Only one result is returned but it is wrapped in an array. And class
Array does not have a destroy method, hence the error. One simple way
around this would be to do:
@portals = Portal.find(:all, :conditions => [‘account_id = ?’,
@account.id ])
…
@portals.each { |p| p.destroy }
HTH,
Matt
On 9-May-08, at 4:42 PM, Matt W. wrote:
returns an array, even if there is only one result. Check this out:
…
how can i deal with this problem?
any ideas?
{"_method"=>“delete”,
“authenticity_token”=>“f8c32ed76159e1b51b0883ef72a4ab801b92d322”,
“id”=>“11”}
or @portals = Portal.find(:first, :conditions [‘account_id = ?’,
@account.id]) #which will return a single AR instance
which would be a problem if Account has_many :accounts
J
And by :accounts I think Jodi means :portals 
Hi there,
–Thanks for the help, i appreciate your help,
solution #1
–first i tried:
@portals.each { |p| p.destroy }
–and it displayed an error:
NoMethodError in AccountsController#destroy
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each
RAILS_ROOT: E:/frameworks/railsapps/listing
Application Trace | Framework Trace | Full Trace
app/controllers/accounts_controller.rb:81:in `destroy'
– I also tried this :
solution #2
class Portal < ActiveRecord::Base
belongs_to :account
end
class Account < ActiveRecord::Base
has_many :portals, :dependent => :destroy
end
but it only deleted the account record,
and then i tryed this because somebody suggested it and it worked
for portal in @portal
portal.destroy
end
the portals under the account id were deleted.
thanks for all the options that all of you gave me,
they seem very logical and very interesting
maybe there’s something that i’m doing wrong,
do you have any idea why i would have this error for the solution #1
NoMethodError in AccountsController#destroy
or why it wouldn’t do the job on solution #2?
RoR_Nb wrote:
I’m trying to delete an account but at the same time i’d like to
delete the portals that belongs to the account.
This is what i wrote but it’s not working.
how can i deal with this problem?
Why not specify it in the models?
class Portal < ActiveRecord::Base
belongs_to :account
end
class Account < ActiveRecord::Base
has_many :portals, :dependent => :destroy
end
delete the Account, and the Portals go poof!
Use :dependent=>:destroy only if you need to do some ‘clean up’
processing in the child models. Destroy instantiates each of the
models before deleting them. If you don’t need to do any processing
then use the more db-efficient :dependent=:delete_all
On May 11, 12:20 am, Ar Chron [email protected]
RoR_Nb wrote:
– I also tried this :
solution #2
class Portal < ActiveRecord::Base
belongs_to :account
end
class Account < ActiveRecord::Base
has_many :portals, :dependent => :destroy
end
but it only deleted the account record,
Curious…
does your Portal model include an account_id?
I use the :dependent => :destroy, and can cascade deletes down several
levels of models…