私は、リレーションシップやフォローなどのソーシャルネットワーク機能を実装するRailsアプリに取り組んでいます。これまでのところ、多対多のリレーションシップで問題が発生するまで、すべてが順調でした。ご存知のように、mongoには結合がないため、推奨される回避策は、関係を両方の関連ドキュメントにIDの配列として格納することです。OK、少し冗長ですが、機能するはずです。
field :followers, type: Array, default: []
field :following, type: Array, default: []
def follow!(who)
self.followers << who.id
who.following << self.id
self.save
who.save
end
これはかなりうまく機能しますが、これはトランザクションが必要になるケースの1つですが、mongoはトランザクションをサポートしていません。IDが「フォロー済み」フォロワーリストに追加されているが、「フォロワー」フォローリストには追加されていない場合はどうなりますか?つまり、最初のドキュメントが適切に変更されたが、何らかの理由で2番目のドキュメントを更新できない場合です。
多分私は悲観的すぎますが、より良い解決策はありませんか?