6

これをどのように表現するかはよくわかりませんが、列が本質的に交換可能なテーブルを実装するための良い方法はありますか?

例:ユーザーモデルがあり、2人のユーザーが「友達」になることを許可したい場合。私にとって明らかな方法は、それぞれがユーザーへのキーを含む2つの列(「friend1」と「friend2」)を含むテーブルを持つことです。これは、「(friend1 = user1 AND friend2 = user2)OR(friend1 = user2 AND friend2 = user1)」をチェックする必要があるため、「user1とuser2の友達です」のように言うのは面倒です。それは機能しますが、そのテーブルから何かを取得したいときはいつでも、両方の列で探しているのは私には厄介なようです。これを行うためのよりエレガントな方法はありますか?

4

3 に答える 3

4

友情関係を築く際の重要な選択は、それが双方向であるかどうかを決定することです。Twitterは一方向の友情の例であり、Facebookの友情は双方向です。あなたは双方向に取り組んでいるように聞こえるので、あなたが持っている2つのオプションは次のとおりです。

1)両方向を確認します

select *
from friendships 
where (friend1 = 123 and friend2 = 456) OR (friend2 = 123 and friend1 = 456)

2)常に低いuser_idをfriend1に入れ、高いuser_idをfriend2に入れてください。そうすれば、テストは一方向のみをチェックする必要があります。これは維持するのが少し難しいので、パフォーマンス上の理由で必要なだけにします。

于 2013-02-28T19:31:23.060 に答える
1

これを実装する方法は少し厄介に思えるかもしれません。アイデアは、friendshipIdとuserの2つの列を持つテーブルに「friendshipId」を含めることです。これで、ユーザーは交換可能になります。

user1とuser2が友達かどうかを確認するには:

select friendshipId
from friends
group by friendshipId
having sum(case when name = user1 then 1 else 0 end) > 0 and
       sum(case when name = user2 then 1 else 0 end) > 0

制約、トリガー、およびストアドプロシージャを適切に使用することで、友人関係には2人のユーザーしかいないこと、誰かが自分自身を友人にすることはできないことなどが保証されます。

于 2013-02-28T19:16:49.717 に答える
0

has_manythroughまたはhas_and_belongs_to_manyhttp://guides.rubyonrails.org/association_basics.htmlを実行でき ます。

ユーザーモデルをリンクする結合テーブルが必要な方法。

例えば

class User < ActiveRecord::Base
  has_many :followings
  has_many :followers, :through => :followings, :class_name => "User"
  has_many :followees, :through => :followings, :class_name => "User"
end


class Following < ActiveRecord::Base 
  # fields: follower_id followee_id (person being followed)
  belongs_to :follower, :class_name => "User"
  belongs_to :followee, :class_name => "User"
end

ユーザーが多くの:usersを持っているのと同じですか、それとも友達ベースのソーシャルネットワークに別の方法を使用する必要がありますか?

于 2013-02-28T19:36:32.920 に答える