【问题标题】:HABTM relation find all records, excluding some based on associationHABTM 关系查找所有记录,不包括一些基于关联的记录
【发布时间】:2013-08-10 18:27:03
【问题描述】:

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

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

我尝试过这样的事情:

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

但这显然也是错误的。

我正在使用 rails 3.2.x

许多与此范围有关的答案,但我以前没有遇到过(我对 Rails 还是很陌生)。

我刚刚发现this 的帖子有一个答案建议:Project.where('id not in (?)', user.projects)

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

编辑

与用户相关的项目模型 sn-p

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

【问题讨论】:

  • 使用&lt;&gt;(SQL) 代替!=(Ruby) 有帮助吗?

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


【解决方案1】:

您可以像这样在项目模型中放置一个范围:

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

【讨论】:

  • 那我该如何使用呢?我不熟悉范围:\
  • 我现在收到SQLite3::SQLException: no such table: projects: SELECT "projects".* FROM "projects" projects_users WHERE (projects_users.user_id &lt;&gt; 1)。连接表肯定存在。不过,我觉得现在正朝着正确的方向前进。
  • 那个SQL不包含join,尝试把表名改成joins部分的符号(并确认表名正确)。
  • 找不到名为“projects_users”的关联。介意我们用这个聊几分钟吗?
  • 或者,尝试直接加入 users 表,但不要更改 where 语法:scope :not_belonging_to, lambda {|user| joins(:users).where('projects_users.user_id &lt;&gt; ?', user.id) }} Rails 应该使用 projects_users 表填充连接。当然,聊聊吧!
【解决方案2】:

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

我在这方面遇到了一段时间。我尝试使用以下内容:

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

【讨论】:

    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多