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
我的问题很简单:如何优化以下查询,以便在数据库增长时不会出现性能问题:
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