Rails查询社交网络订阅源

时间:2016-12-18 03:08:50

标签: sql ruby-on-rails activerecord

模型的架构很简单。

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 个答案:

答案 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]))