2014-03-12 75 views
1

我已經完成了我的盡職調查,但無法找出此問題。 (1)不能是current_user和(2)不能被current_user跟隨。我試圖找到一組隨機的5個用戶,即(1)不能是current_user和(2)不能被current_user跟隨。查詢以發現current_user未跟隨的隨機5個用戶

我試圖把這個放入變量@users。我的關係設置在用戶有followed_users(他們正在關注的用戶)和用戶有followers

用戶模式

has_many :relationships, foreign_key: "follower_id", :dependent => :destroy 
has_many :followed_users, through: :relationships, source: :followed 
has_many :reverse_relationships, foreign_key: "followed_id", 
            class_name: "Relationship", 
            dependent: :destroy 
has_many :followers, through: :reverse_relationships, source: :follower 

關係模型

belongs_to :follower, class_name: "User", touch: true 
belongs_to :followed, class_name: "User", touch: true 

不幸的是,我在可怕的查詢,以便我不知道如何找到這個陣的用戶。除了您將要實現的解決方案之外,任何可以自己學習如何高效查詢的資源都將非常值得讚賞。

如果您需要更多代碼來幫助解決問題,請讓我知道。

感謝

回答

2

這可能會爲你工作:

User.includes(:reverse_relationships) 
    .where("#{Relationship.table_name}.follower_id <> :id", id: current_user.id) 
    .where("users.id <> ?", current_user.id) 
    .order("RAND()") 
    .limit(5) 

不知道的RAND()函數,它取決於你的數據庫。

最終取代id <> :idid NOT IN (?)能夠通過不僅僅是一個ID多個:

scope :some_other_users, lambda { |user_ids| 
    user_ids = user_ids.kind_of?(Array) ? user_ids : [user_ids] 
    includes(:reverse_relationships) 
    .where("#{Relationship.table_name}.follower_id NOT IN (?)", user_ids) 
    .where("users.id NOT IN (?)", user_ids) 
    .order("RAND()") 
    .limit(5) 
} 

query_getting_followed_user_ids = Relationship.where("follower_id IN (?)", [current_user.id]).select("relationships.followed_id").to_sql 
User.where("id NOT IN (#{query_getting_followed_user_ids})") 
    .where("id <> ?", current_user.id) 
    .order("RAND()") 
    .limit(5) 

正如你所看到的,我想做出一個結果查詢其他查詢:Query-ception

+0

我也可以指望你的@MrYoshiji進行這些查詢!哈哈我收到錯誤'表'reverse_relationships''丟失FROM-clause條目。我會更新我的問題來澄清,也許我沒有提供足夠的信息 –

+0

我是否需要用'關係'替換'reverse_relationships'? 'Relationships'是我的數據庫中的表格 –

+0

嗯是使用表的真實姓名,我應該已經看到了;)(更新我的回答後果) – MrYoshiji