1

User モデル/テーブルと Friend モデル/テーブルがあります。users テーブルには、ユーザーの Facebook uid を格納する uid 列があります。friends テーブルには、Facebook の友達が格納されます (user_id 列によって関連付けられます)。

users テーブルにアカウントを持つ特定のユーザーの友人全員を照会するにはどうすればよいですか? 言い換えれば、ユーザー 13 のサインアップした友人 (users テーブルに存在する) のユーザー モデルを返す必要があります。

4

3 に答える 3

1

同じ問題の私のモデル

class User < ActiveRecord::Base
    has_many :friendships
    has_many :friends, through: :friendships
    # ...
end

class Friendship < ActiveRecord::Base
    belongs_to :user
    belongs_to :friend, :class_name => 'User', :foreign_key => 'friend_id', :primary_key => 'facebook_id'
end
于 2013-06-12T11:16:08.347 に答える
0

対象のユーザーが次によって参照されていると仮定します@user

User.joins("inner join friends on friends.uid = users.uid")
.where("friends.user_id = ?", @user.id)

これを行うには、おそらく、arel をより有効に活用するための、より「レールのような」方法があります。

于 2013-06-12T06:29:50.103 に答える
0

私がモデルを持っている場合:

class User < ActiveRecord::Base
  attr_accessible :name, :uid
  has_many :friends
end

class Friend < ActiveRecord::Base
  attr_accessible :uid
  belongs_to :user
  belongs_to :account, foreign_key: 'uid', primary_key: 'uid', class_name: 'User'
end

それから私はすることができます:

u=User.create(name: 'Alice', uid: 'fb1')
u2=User.create(name: 'Bob', uid: 'fb2')
u.friends.create(uid: 'fb2') # add Bob as friend
u.friends.create(uid: 'fb9') # add someone as friend

u.friends # gives all friends
  Friend Load (0.3ms)  SELECT "friends".* FROM "friends" WHERE "friends"."user_id" = 4
=> [#<Friend id: 3, user_id: 4, uid: "fb2">, #<Friend id: 4, user_id: 4, uid: "fb9">]

u.friends.joins(:account) # only friends having an account
  Friend Load (0.2ms)  SELECT "friends".* FROM "friends" INNER JOIN "users" ON "users"."uid" = "friends"."uid" WHERE "friends"."user_id" = 4
=> [#<Friend id: 3, user_id: 4, uid: "fb2">]

whileincludesは内部結合を行わず、すべての友達に次のように与えます:

u.friends.includes(:account)
  Friend Load (0.2ms)  SELECT "friends".* FROM "friends" WHERE "friends"."user_id" = 4
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."uid" IN ('fb2', 'fb9')
=> [#<Friend id: 3, user_id: 4, uid: "fb2">, #<Friend id: 4, user_id: 4, uid: "fb9">]
于 2013-06-12T06:43:07.370 に答える