我正在做一個社交媒體網站,類似於Facebook和數量的結果,N + 1個查詢放緩我失望在以下情況 -導軌 - 消除N + 1個查詢存在的訪存結果
我的朋友表的模式 - 它有3列,user_id(發送請求的用戶),friend_id(接收請求的人)和pending(表示請求是否被接受的布爾值)如果用戶拒絕請求,那麼條目從表中刪除
用戶有一個朋友的方法,看起來像這樣 -
def friends
user_ids = Friend.where(
'(user_id = :id OR friend_id = :id) AND pending = false',
id: self.id
).pluck(:user_id, :friend_id)
.flatten
.uniq
.reject { |id| id == self.id }
User.where(id: user_ids)
end
我意識到這個方法並不好,因爲它執行2個SQL查詢。任何建議,以改善這是值得歡迎的,但我希望在這個問題上解決另一個問題。
對於我的看法,我希望得到一個用戶的所有朋友,也是朋友的數量,每個朋友都有。這將使我能夠實現列出朋友的朋友列表,以及朋友的朋友數量。
要這樣做是醜陋的方式 -
json.friends @user.friends do |friend|
json.extract! friend, :id, :name, :profile_pic
json.number_friends friend.friends.length
end
但很明顯,這不是有效的。
是否存在被我可以獲取用戶的朋友的一種方式,和好友的號碼是每個朋友都在一個單一的查詢?
或緩存每個用戶的朋友數量我唯一的解決方案?
編輯 - 一個朋友模型有幾個belongs_to的關聯,即belongs_to的=>用戶和belongs_to的=>朋友
belongs_to :user,
class_name: "User",
foreign_key: :user_id,
primary_key: :id
belongs_to :friend,
class_name: "User",
foreign_key: :friend_id,
primary_key: :id
用戶模型得到他的朋友們使用上面的帖子寫的方法
您有2模特'User'和'Friend'?如果是的話,他們之間的聯繫是什麼。 –
SQL解決方案能爲你工作嗎? –
@JuanCarlosOropeza我更喜歡ActiveRecord,但是如果SQL是唯一的解決方案,那麼肯定,我會採取 – satnam