2

ユーザー間の友情をモデル化するアプリケーションに取り組んでいます。

class User
  has_many :friendships
  has_many :friends, 
           :through => :friendships,
           :conditions => "status = #{Friendship::FULL}"
end
class Friendship
  belongs_to :user
  belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"
end

2 人のユーザーがフレンドになると、フレンドシップ クラスのインスタンスが 2 つ (フレンドシップの方向ごとに 1 つずつ) 作成されます。これは、各方向に異なるアクセス許可を設定できるため、またルックアップを容易にするために必要です。そのため、2 番目のインデックスを作成して検索を 2 倍にする必要なく、常に user_id で検索します。

find または名前付きスコープのいずれかを使用して、カウンターフレンドシップとともに友人を引き上げることは可能ですか? ユーザーが友情の自分の足に保存されている友情のアクセス許可を編集できるようにするため、これを行いたいと思います。したがって、友人の情報をユーザーに表示するときは、反対の足を確認する必要があります権限の設定方法。(余談ですが、これは理にかなった方法のように思えますか?反対側に保存するか、表示する前に反対側を参照する必要があるか、どちらも不快です。)

私は仕事をするSQLのバッチを作ることができました:

def self.secure_friends(user_id)
  User.find_by_sql("SELECT u.*, cf.permissions
                    FROM users u 
                    INNER JOIN friendships f ON u.id = f.friend_id 
                    INNER JOIN friendships cf ON u.id = cf.user_id AND cf.friend_id = #{user_id} 
                    WHERE ((f.user_id = #{user_id}) AND (f.status = #{Friendship::FULL}))")
end

この関数は、ユーザーのすべての友達の名前と ID、および権限を返します。ただし、これは実際には理想的ではないように思われます。つまり、friend.permissions を呼び出してアクセス許可にアクセスする必要があることを意味します。ここで、アクセス許可は実際には friend のメンバーではなく、find_by_sql によって属性としてマージされているだけです。全体として、named_scope または find 呼び出しを使用してこれを実行したいのですが、残念ながら、そのアプローチを使用しようとすると、Rails が同じ Friendship 結合テーブルを結合することでチョークするため、エラーが発生しました。クエリを 2 回。

4

1 に答える 1

2

あなたがどれだけやりたいか、プラグインにどれだけのことを許可するかはわかりませんが、私はこの has_many_friends プラグインを使用して大きな成功を収めました: Github の has_many_friends プラグイン

ソースを見てインスピレーションを得ることができます...次のようなものを持つ友情モデルが必要です:

belongs_to :friendshipped_by_me,   :foreign_key => "user_id",   :class_name => "User"
belongs_to :friendshipped_for_me,  :foreign_key => "friend_id", :class_name => "User"

その後、ユーザークラスで次のようにします。

has_many :friends_by_me,
         :through => :friendships_by_me,
         :source => :friendshipped_for_me

あるいは単に

/アプリ/モデル/ユーザー

has_many_friends

後で:

@current_user.friends.each{|friend| friend.annoy!}
于 2010-06-15T21:04:36.760 に答える