模型的架构很简单。
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_id
和user_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
其他用户订阅的问题。
这是我认为的网站中常见的情况。但我在这里找不到任何解决方案。提前谢谢。
答案 0 :(得分:1)
一种可能的解决方案是使用子查询来选择将从主查询中排除的所有读取Hunt
记录。这将为您提供Hunt
未创建和读取的所有User
条记录(参数[:id])
Hunt.where.not(user_id: params[:id])
.where.not(id: UserHunt.select(:hunt_id).where(user_id: params[:id]))