Каков наилучший способ уничтожить обе стороны самоссылочной ассоциации? - PullRequest
1 голос
/ 07 января 2011

В моем проекте у меня есть ассоциативная ссылка.

У меня есть модель пользователя:

class User < ActiveRecord::Base
  has_many :relationships, :dependent => :destroy
  has_many :peers, :through => :relationships
end

и модель отношений:

class Relationship < ActiveRecord::Base
  belongs_to :user
  belongs_to :peer, :class_name => "User"
end

Когда два пользователя равноправны друг с другом, очевидно, что в базе данных есть две записи.

Когда один пользователь решает прекратить отношения, я бы хотел, чтобы это уничтожило обе записи - нетолько одна сторона отношений.

Есть ли лучший способ сделать это, чем загружать отношения дважды в контроллер (по одному для каждой стороны отношений)?

1 Ответ

1 голос
/ 07 января 2011

Пара способов сделать это

Во-первых, это триггер после удаления , это довольно противоречивый способ сделать что-то, если вы верите в ложное обещание агностицизма в отношении базы данных, однако он работает - по сути, вы смотрите на старое. peer_id и old.user_id, а затем выполните удаление, но поменялись ролями. Если вы хотите пойти по этому пути, вам следует обратиться к руководству по базе данных, чтобы узнать, как реализовать триггер.

Второй способ - это after_destroy обратный вызов , где вы делаете

after_destroy do |record| 
  other = Relationship.find_by_user_id_and_peer_id(record.peer_id, record.user_id)
  other.destroy if other
end

Другая, и, возможно, более радикальная мера - это переработать модель, чтобы она имела логически допустимое поле, в котором обе стороны отношения моделируются одной записью в базе данных, есть ограничения на записи, где (peer_id, user_id) = (user_id, peer_id) , Таким образом, вам не придется беспокоиться об удалении обеих сторон или дублировании записей.

...