ユーザー用に次のモデルがあります。
class User < ActiveRecord::Base
has_many :facebook_friendships
has_many :facebook_friends, :through => :facebook_friendships, :source => :friend
def mutual_facebook_friends_with(user)
User.find_by_sql ["SELECT users.* FROM facebook_friendships AS a
INNER JOIN facebook_friendships AS b
ON a.user_id = ? AND b.user_id = ? AND a.friend_id = b.friend_id
INNER JOIN users ON users.id = a.friend_id", self.id, user.id]
end
end
class FacebookFriendship < ActiveRecord::Base
belongs_to :user
belongs_to :friend, :class_name => 'User'
end
ID 53 のユーザーと ID 97 のユーザーが互いに友達である場合、データベースの facebook_friendships テーブルに行 [53, 97] と [97, 53] があります。これは、相互の友人を計算するために私が思いついた生のSQLクエリです。
SELECT users.* FROM facebook_friendships AS a
INNER JOIN facebook_friendships AS b
ON a.user_id = :user_a AND b.user_id = :user_b AND a.friend_id = b.friend_id
INNER JOIN users ON users.id = a.friend_id
配列の代わりに関係を返すために、私は Mutual_friends_with を使います。このようにして、結果を where(college: 'NYU') などの他の条件と連鎖させて、ActiveRecord の利点をすべて得ることができました。これを行う良い方法はありますか?