2016-12-18 4 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は、これらの飼料中にhuntsを見ることができます。彼らはそれを受け入れるか拒否することができます。これにより、UserHuntの行がhunt_iduser_idになります。だから私が欲しいのは、これらのことを満足するHuntの結果です。

  • Hunt
  • Userhunt.user_id != id)彼自身ではないの前に狩りを見ていない(これは私が実現するのは困難見つけるのです一部です)

試験の多くの後、これは何です私は思いついた。

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レコードを選択し、メインクエリから除外できます。これにより、User(params [:id])で作成されていないすべてのHuntレコードが表示されます(params [:id])

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