2016-12-18 95 views
1

該模型的架構很簡單。Rails查詢社交網絡訂閱源

class User < ActiveRecord::Base 
    has_many :hunts, dependent: :destroy 
    has_many :user_hunts, dependent: :destroy 
end 

class Hunt < ApplicationRecord 
    belongs_to :user 
    has_many :user_hunts, dependent: :destroy 
end 

class UserHunt < ApplicationRecord 
    belongs_to :user 
    belongs_to :hunt 
end 

User可以創建狩獵。其他Users可以在其Feed中看到這些hunts。他們可以接受或拒絕。這將在UserHunt中產生一行hunt_iduser_id。所以我想要的是符合這些條款的Hunt的結果。

  • Hunt不是自己的(hunt.user_id != id
  • User未見狩獵之前(這是我發現很難實現的部分)

大量試驗後,這是什麼我想出了。

Hunt.left_outer_joins(:user_hunts) 
    .where('user_hunts.user_id != ? OR user_hunts.user_id is null AND hunts.user_id != ?',id,id) 

但這有選擇hunts其他用戶所訂閱的一個問題。

這是我相信網站中的一種常見情況。但我無法在這裏找到任何解決方案。提前致謝。

回答

1

一種可能的解決方案是使用子查詢來選擇將從主查詢中排除的所有讀取Hunt記錄。這會給你所有Hunt未被創建和讀取的記錄User(params [:id])

Hunt.where.not(user_id: params[:id]) 
    .where.not(id: UserHunt.select(:hunt_id).where(user_id: params[:id]))