これは難しい問題です。
対称関係をどのようにモデル化しますか?
前回これを行ったとき、実際には対称ではないと判断しました。これをモデル化する方法については、Disapora のContact
クラスを参照してください。
class Contact < ActiveRecord::Base
belongs_to :user
belongs_to :person
validates :person, :presence => true
validates_presence_of :user
validates_uniqueness_of :person_id, :scope => :user_id
end
一意性を確保するために特別なことは何もしていないことに気付くでしょう。
彼らが代わりに行うことは、友情を生み出すか壊す相互作用の各ポイントを慎重に検討することです. それらをトランザクションでラップするように注意する必要があります。
基本的に、ユーザーが「友達リクエスト」を送信すると、
- 「ユーザー」から「友人」への連絡先を「保留中」ステータスで作成します
- 「友人」から「ユーザー」への連絡先を「要求済み」ステータスで作成します
「友達」がこの「依頼」を承諾したとき
- 両方の連絡先が「承認済み」に設定されています
「友達」が友情を壊すことを選択した場合
- 両方の連絡先が削除されました
これらの各アクションは、トランザクションで実行する必要があります。
これらのトランザクションが正しく 1 つである限り、私たちは一方通行の友情を持つべきではありません。