Model.all 的替代方案 - Model.where(条件)

Alternative for Model.all - Model.where(condition)

我的问题很简单:如何优化以下查询,以便在数据库增长时不会出现性能问题:

def projects_not_participating
  @project = Project.all - Project.joins(:participants).where(participant: {id: current_user.id})
end

我的模型设置是这样的:

def Project
  has_many :assignments
  has_many :participants, through: :assignments
end
def Participant
  has_many :assignments
  has_many :projects, through: assignments
end

我试过使用

Project.joins(:participant).where.not(participant: {id: current_user.id})

但这返回了所有项目。我发现查询正在返回 assignments 中的所有 table 条目,其中 participant_id 不是 current_user.id 并且没有对之前的项目条目进行分组。

实际上,您已经非常接近解决方案了。当前的问题是重复项目。为避免这种情况,您可以使用 distinct:

Project.joins(:participants).where.not(participants: {id: current_user.id}).distinct

我终于找到了解决办法。我在 Project class:

中添加了一个方法
def self.not_participating(user)
  where.not(id: user.projects)
end

并在我的 User 控制器中使用它:

def find_projects
  @projects = Project.not_participating(current_user)
end