why does #destroy() DELETE FROM one at a time?

I have a pair of models with a fairly standard :has_many relation. The
only twist is that the has_many table is a namespaced STI table:

module MeteredService
  class Base < ActiveRecord::Base
    has_many :service_bills, :foreign_key => :metered_service_id,
:dependent => :destroy
    ...
  end
end

class ServiceBill < ActiveRecord::Base
  belongs_to :metered_service, :class_name => "MeteredService::Base",
:foreign_key => "metered_service_id"
  ...
end

When I do

  my_metered_service.destroy

Rails generates individual DELETE FROM commands (and there are a lot of
them)
...
DELETE FROM "service_bills" WHERE "service_bills"."id" = $1 [["id",
633398]]
DELETE FROM "service_bills" WHERE "service_bills"."id" = $1 [["id",
633399]]
...

Question 1: Is this the expected behavior? I would think Rails would be
smart enough to do the deletions in a single statement along the lines
of:

DELETE FROM "service_bills" WHERE metered_service.id =
my_metered_service.id

Question 2: If this is NOT the expected behavior, have I set up my STI
relations incorrectly?

Sometimes I intentionally introduce small typos to see if you're paying
attention! :slight_smile: The suggested SQL should have read:

DELETE FROM "service_bills" WHERE metered_service_id =
my_metered_service.id

I have a pair of models with a fairly standard :has_many relation. The
only twist is that the has_many table is a namespaced STI table:

module MeteredService
class Base < ActiveRecord::Base
   has_many :service_bills, :foreign_key => :metered_service_id,
:dependent => :destroy
   ...
end
end

class ServiceBill < ActiveRecord::Base
belongs_to :metered_service, :class_name => "MeteredService::Base",
:foreign_key => "metered_service_id"
...
end

When I do

my_metered_service.destroy

Rails generates individual DELETE FROM commands (and there are a lot of
them)
...
DELETE FROM "service_bills" WHERE "service_bills"."id" = $1 [["id",
633398]]
DELETE FROM "service_bills" WHERE "service_bills"."id" = $1 [["id",
633399]]
...

Question 1: Is this the expected behavior? I would think Rails would be
smart enough to do the deletions in a single statement along the lines
of:

It is expected. You've set :dependent => :destroy. That tells Rails that you want to instantiate each of the related objects and call destroy on it -- in order that each of those objects destroy callbacks also get called.

DELETE FROM "service_bills" WHERE metered_service.id =
my_metered_service.id

Question 2: If this is NOT the expected behavior, have I set up my STI
relations incorrectly?

If you don't need to pick up any of those callbacks you can set :dependent => :delete_all

See the docs for :has_many for more info...

-philip