2

我已经查看了一些与此相关的类似 SO 帖子,但我很难理解它。

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

我试过这样的事情:

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 的回答评论线程中的建议,但它给了我第二个语法错误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
4

2 回答 2

3

您可以像这样在 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) }
于 2013-08-10T18:57:07.397 回答
1

从上面马特的回复中,这非常有帮助。

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

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

但我收到以下错误:

SELECTSQLite3::SQLException:对于作为表达式的一部分的a 只允许一个结果:

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

scope :not_belonging_to, lambda {|developer| where('id NOT IN (?)', developer.projects.empty? ? '' : developer.projects.ids) }
于 2014-04-29T18:03:45.553 回答