0

典型的なソーシャル機能を備えたアプリケーションを開発しています。基本的に、2 人のユーザーが友達になることができます。これは、2 人のユーザーの ID を含む「Friendship」と呼ばれる連想クラスを通じて行われます。明らかに、両方のキーを「user_id」と呼ぶことはできません。通常の方法は、両方のキーに異なる名前を付けて、:class_name で機能させることです。

問題は、この関係が完全に互恵的であることです。友情は一方的なものではあり得ないからです。それは、Twitter ではなく Facebook のように機能します。キー「creator」と「acceptor」に名前を付ける情報を追加したくありません。数字「user_1_id」または「user_2_id」を使用するとひどいように聞こえます。

質問: この名前付けの問題について、Rails に規則はありますか?

4

2 に答える 2

1

私は通常、そのような状況でデータを正規化します。

class User
  has_many :friendships
  has_many :friends
end

class Friendship
  belongs_to :user
  belongs_to :friend, :class_name => "User"

  after_create :reciprocate_friendship

  def reciprocate_friendship    
    return if friend.friends.exists?(user) # do nothing if reciprocal friendship exists
    friend.friends << user
  end
end

このようにして、フレンド クエリを最適化しています。

編集

User友人関係を 1 つの行に格納する必要がある場合は、モデルに関連付けを追加します。

has_many :network_friends, :class_name => "User", :finder_sql => Proc.new {
  %Q{
    SELECT * FROM users
    JOIN friendships 
      ON (users.id = friendships.user_id OR users.id = friendships.friend_id)
    WHERE users.id = #{id}
  }
}

これで、新しい関連付けを次のように使用できます。

user1.friends  << user2
user3.friends << user1
user1.network_friends # [ user2, user3]
于 2012-07-03T16:52:41.553 に答える
1

andを使用したこのテーマに関するrailscastsのチュートリアルがあり、これは賢明と思われます。また、相互関係もサポートしています。userfriend

于 2012-07-03T16:46:32.383 に答える