Rails3 удаляет мне записи HABTM, когда обратный вызов возвращает false - PullRequest
2 голосов
/ 15 августа 2011

У меня есть эта модель:

class User < ActiveRecord::Base
  has_and_belongs_to_many :roles

  before_destroy do |u|
    if u.superadmin? and User.joins(:roles).where(:roles => {:superadmin => true}).count == 1
      u.errors.add(:base, "cannot delete last admin user")
      return false
    end
    return true
  end
end

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users
end

Когда я пытаюсь удалить последний superadmin, обратный вызов before_destroy добавляет к массиву ошибок и возвращает false.Я получаю сообщение об ошибке в контроллере, все, кажется, в порядке.

За исключением Rails3 удаляет меня запись из таблицы соединения . Почему ?Я вернул false, так как я возвращаю false, он должен не продолжать с удаления.Вот журнал:

SQL (0.2ms)  SELECT COUNT(*) FROM "users" INNER JOIN "roles_users" ON "roles_users"."user_id" = "users"."id" INNER JOIN "roles" ON "roles"."id" = "roles_users"."role_id" WHERE "roles"."superadmin" = 't'
AREL (0.4ms)  DELETE FROM "roles_users" WHERE "roles_users"."user_id" = 1 AND "roles_users"."role_id" IN (1, 4)
Organization Load (0.4ms)  SELECT * FROM "organizations" INNER JOIN "organizations_users" ON "organizations".id = "organizations_users".organization_id WHERE ("organizations_users".user_id = 1 )

Спасибо за помощь.

1 Ответ

2 голосов
/ 15 августа 2011

Это похоже на ошибку rails, если вы используете более старую версию Rails (это должно быть решено в Rails 3.0.6 AFAIK):

https://rails.lighthouseapp.com/projects/8994/tickets/6191-habtm-association-is-being-destroyed-before-the-before_destory-callbacks-are-executed

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...