2

Railsで対称関係(ユーザー間の友情など)をモデル化するエレガントな方法を探しています(ただし、これは一般的なデータベースの問題かもしれません)。私はいくつかのアプローチを知っていますが、どれもエレガントに見えません:

  1. ユーザーの外部キーを持つ user_user 関係テーブルを作成します。それは本質的に非対称なソリューションであるため、私はそれが好きではありません。より低いIDを持つユーザーを最初の列に、もう一方のユーザーを2番目の列に強制し、ユニオンを使用して両端から関係を照会するアプローチを見ました。これはハックのように感じます。

  2. 各行が関係を表すフレンドシップ テーブルを作成します。

    • 1 対 1 の場合:ユーザー テーブルに列を追加して、関係を参照します。
    • 多対多の場合: users テーブルと friends テーブルへの外部キーを保持する user_friendship テーブルを追加します。

    このアプローチの問題点は、扱いにくいように見えることと、友情が 2 人のユーザーによって正確に共有されることを強制するものがないことです。

これらよりもエレガントなソリューションがあることを願っています。何か案は?

4

1 に答える 1

1

友人であるユーザーの外部キーを保持するモデルの友情を作成します。次のようなことを行うだけで、同じユーザーとの友情が1つだけであることを保証する検証を行うことができます:

validates :friend_id, :uniqueness => { :scope => :user_id }

私の意見では、これは多くの柔軟性を提供する非常にエレガントなソリューションです。 友情のようなものをモデル化したい場合は、Rails ガイドの「A Guide to Active Record Associations」の has_one :through 関連付けを確認してください。

もちろん、has_and_belongs_to_many 関連付けもあります。ただし、モデルを作成する場合ほどの柔軟性は提供されないため、通常はあまり良い考えではありません。

于 2012-06-03T19:23:32.893 に答える