Я пытаюсь предотвратить удаление связанной записи, если у нее есть собственные связанные записи. Rails, похоже, подрывает параметр :depend => :restrict и все равно выполняет DELETE SQL. Что мне не хватает?
class User < ActiveRecord::Base
has_many :user_regions
has_many :events, :through => :user_regions
has_many :regions, :through => :user_regions
end
class Region < ActiveRecord::Base
has_many :user_regions
has_many :events, :through => :user_regions
end
class UserRegion < ActiveRecord::Base
belongs_to :user
belongs_to :region
has_many :events, :dependent => :restrict
end
class Event < ActiveRecord::Base
belongs_to :user_region, :readonly => true
has_one :planner, :through => :user_region, :source => :user
has_one :region, :through => :user_region
end
Теперь предположим, что у меня есть два региона [R1 и R2], два пользователя [U1 и U2]. U1 был назначен как R1, так и R2 [как UR1 и UR2], а U2 был назначен только R2 [как UR3]. Это дает в общей сложности три UserRegion.
Кроме того, у меня есть события E1, E2 и E3, где E1 находится в UserRegion UR1, E2 — в UserRegion UR2, а E3 — в UserRegion UR3. Это дает U1 два события и U2 одно событие.
ЧТО ДОЛЖНО ПРОИЗОЙТИ: Если я попытаюсь удалить назначение U1 на R2 (т. е. уничтожить UR2), я должен получить сообщение об ошибке, так как U1 имеет события через UR2.
ЧТО СЛУЧИЛОСЬ:
u1 = User.find(1)
urids = u1.regions.map &:id
=> [1,2]
u1.region_ids = [1]
Region Load (0.3ms) SELECT "regions".* FROM "regions" WHERE "regions"."id" = ? LIMIT 1 [["id", 1]]
Region Load (0.3ms) SELECT "regions".* FROM "regions" INNER JOIN "user_regions" ON "regions"."id" = "user_regions"."region_id" WHERE "user_regions"."user_id" = 1
(0.1ms) begin transaction
SQL (0.3ms) DELETE FROM "user_regions" WHERE "user_regions"."user_id" = 1 AND "user_regions"."region_id" = 2
(2.7ms) commit transaction
=> [1]
Очевидно, что Rails не выполняет обратные вызовы :destroy для удаляемой области пользователя, потому что, если бы я попытался сделать:
UserRegion.find(2).destroy
Я получаю сообщение об ошибке, и транзакция откатывается.
Что мне нужно сделать, чтобы назначение идентификаторов регионов пользователю не удаляло пользовательские регионы?
Цель здесь состоит в том, чтобы форма «редактировать пользователя» имела список флажков для назначения регионов. Должна быть возможность добавлять регионы пользователю и удалять регионы, в которых у пользователя нет событий.