HABTM关系查找所有记录,不包括基于关联的记录

时间:2013-08-10 18:27:03

标签: ruby-on-rails activerecord has-and-belongs-to-many

我已经看过一些与此相关的类似SO帖子,但我正在努力解决这个问题。

我在项目和用户之间有一个关系。我试图找到特定用户不属于的所有项目,但我不知道如何。

我尝试过这样的事情:

Project.where('project_id != ?', user.id)

但它显然也是错误的。

我使用的是rails 3.2.x

与此相关的许多答案都提到了范围,但我之前没有碰到它们(我还是Rails的新手)。

我刚发现this帖子,其中一个答案提示:Project.where('id not in (?)', user.projects)

似乎有效,除非user.projects为空。我按照JosephCastro的回复评论帖中的建议尝试了Project.where('id not in (?)', (d.projects.empty? ? '', d.projects)) ,但它在第二个d.projects上给出了语法错误。

修改

与用户相关的项目模型摘要

class Project < ActiveRecord::Base
  attr_accessible ...
  has_and_belongs_to_many :users, :before_add => :validates_unique

然后

class User < ActiveRecord::Base
  attr_accessible ...
  has_and_belongs_to_many :projects

2 个答案:

答案 0 :(得分:3)

您可以在项目模型中放置一个范围,如下所示:

scope :not_belonging_to, lambda {|user| joins(:projects_users).where('projects_users.user_id <> ?', user.id) }}

这假设您的连接表名称与HABTM关联

的rails约定相匹配

然后获取用户不属于的项目,首先找到您的用户,然后将其传递到范围内,如下所示:

@user = User.find(params[:id]) # example
@unowned_projects = Project.not_belonging_to(@user)

经过反思,该范围将无效,因为它会找到拥有多个开发人员的项目,如果其中一个是你的人。

相反,请使用以下内容:

scope :not_belonging_to, lambda {|user| where('id NOT IN (?)', user.projects.empty? ? '' : user.projects) }

答案 1 :(得分:1)

从Matt的上述回复中,这非常有帮助。

我有一段时间遇到麻烦了。我试图使用以下内容:

scope :not_belonging_to, lambda {|developer| where('id NOT IN (?)', developer.projects.empty? ? '' : developer.projects) }

但是我收到了以下错误:

SQLite3 :: SQLException:只有一个结果允许作为表达式一部分的SELECT

我发现我需要更新范围,最后添加.ids。见下文:

scope :not_belonging_to, lambda {|developer| where('id NOT IN (?)', developer.projects.empty? ? '' : developer.projects.ids) }