зависимый =>: уничтожить таблицу, которая содержит две строки для «одинакового результата» - PullRequest
2 голосов
/ 28 июня 2011

Итак, у меня есть таблица дружбы, которая выглядит следующим образом:

  create_table "friendships", :force => true do |t|
    t.integer "user_id"
    t.integer "friend_id"
    t.integer "status"
  end

Для каждой созданной дружбы вставляются две строки, с обратными user_id и friend_id.Когда пользователь удален, дружба также должна быть удалена.Этот код удаляет один из них:

  has_many :friendships, :dependent => :destroy

Но это удаляет только одну из дружеских отношений.В моей модели дружбы у меня есть этот код:

  belongs_to :user
  belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"

У меня также есть собственный метод для удаления дружеских отношений, который создает транзакцию, которая вызывает уничтожение на обоих связанных объектах.

Мое решение будетпереопределить метод destroy в User, перебрать все его дружеские отношения и вызвать мой метод remove для них.Это работает, но это элегантное решение?Я чувствую, что может быть хороший Rails-способ сделать это.

Спасибо.

1 Ответ

0 голосов
/ 28 июня 2011

Самое элегантное решение - это иметь два has_many отношения в модели User: одно для «друзей этого пользователя» (которое у вас уже есть) и одно для «пользователей, которые называют этого пользователя другом». Затем установите :dependent => :destroy на них обоих:

def User
    # Friends of this user
    has_many :friendships, :dependent => :destroy
    has_many :friends, :through => :friendships

    # Users who call this user a friend
    has_many :friendships_of, :class_name => "Friendship", :foreign_key => "friend_id", :dependent => :destroy
    has_many :friends_of, :through => :friendships_of
end

Это будет означать, что уничтожение пользователя также удаляет любые записи дружбы, которые ссылаются на этого пользователя как на user_id или friend_id.

Удаление обоих связанных объектов при побитии рекорда дружбы кажется плохой идеей - уничтожение дружбы обычно не означает, что оба друга перестают существовать!

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