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

我看过一些与此相关的类似SOpost,但我很难理解它。

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

我尝试过这样的事情:

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

但这显然也是错的。

我正在使用rails 3.2.x.

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

我刚发现这篇文章有一个答案暗示: Project.where('id not in (?)', user.projects)

这似乎有效,除非user.projects为空。 我正在尝试Project.where('id not in (?)', (d.projects.empty? ? '', d.projects))正如JosephCastro的回答评论post中所建议的那样,但它给了我一个语法错误第二个d.projects

编辑

与用户相关的项目模型代码段

 class Project  :validates_unique 

然后

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

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

 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) } 

从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) }